boolean init; void setup() { size(300,300,P3D); //smooth(); init=true; } void draw() { if (init) { init=false; initHair(); mousevec=new Mousevec(); } background(255); if (mouseX!=0||mouseY!=0) { mousevec.update(); } updateHair(); } void mousePressed() { init=true; } ////////////////////////////// Mousevec class ////////////////////////////// Mousevec mousevec; class Mousevec { float deg=0, len=0; Mousevec() {} void update() { float mx=mouseX, my=mouseY, pmx=pmouseX, pmy=pmouseY; float dx=mx-pmx, dy=my-pmy; len=sqrt(sq(dx)+sq(dy)); if (mx!=pmx&&my!=pmy) { deg=atan2(dy,dx); } //stroke(255,0,0); //line (mx,my,mx+2*len*cos(deg),my+2*len*sin(deg)); } } ////////////////////////////// end Mousevec ////////////////////////////// ////////////////////////////// Hair class ////////////////////////////// int nr_hair=500; Hair[] hair; void initHair() { hair=new Hair[nr_hair]; for (int i=0;i1&&d<50) { rot+=0.01*(getTurnDirection(dir,hair[i].dir)/d); } } if (mousevec.len!=0) { float d=dist(x,y,mouseX,mouseY); if (d>1&&d<50) { rot+=0.1*(getTurnDirection(dir,mousevec.deg)/d); } } rot*=0.97; dir+=rot; while (dir>PI) {dir-=TWO_PI;} while (dir<-PI) {dir+=TWO_PI;} drawMe(); } void drawMe() { stroke(0); line(x,y,x+len*cos(dir),y+len*sin(dir)); } } ////////////////////////////// end Hair class ////////////////////////////// // calculate shortest degree from deg1 to deg2 float getTurnDirection(float deg1, float deg2) { float rdeg=(deg1>deg2)?deg2-(deg1-TWO_PI):deg2-deg1; if (rdeg