class Curver{ Vec3D position; Vec3D prevPosition; Vec3D heading; Vec3D prevHeading; float step; float age; float turnPerStep; float newTurnPerStep; boolean overEdge; Curver(){ position = new Vec3D(random(800f),random(800f),0f); prevPosition=new Vec3D(position); heading = new Vec3D(random(-1f,1f),random(-1f,1f),0f); heading.normalize(); prevHeading = new Vec3D(heading); age=1.0f; step=1.0f; newTurnPerStep=turnPerStep=random(0.005f)*(random(100f)<50f?-1f:1f); overEdge=false; } void update(int[][] Grid){ prevPosition.set(position); prevHeading.set(heading); overEdge=false; position.addSelf(heading.scale(step)); if(position.x<0.01f*width){ position.x+=0.98f*width;overEdge=true;} if(position.x>=0.99f*width){ position.x-=0.98f*width;overEdge=true;} if(position.y<0.01f*height){ position.y+=0.98f*height;overEdge=true;} if(position.y>=0.99f*height){ position.y-=0.98f*height;overEdge=true;} age+=0.01f; Vec3D newHeading = new Vec3D(heading.x*cos(turnPerStep)-heading.y*sin(turnPerStep),heading.y*cos(turnPerStep)+heading.x*sin(turnPerStep),0f); heading.set(newHeading); if(random(100f)<1f) newTurnPerStep=random(0.005f)*(random(100f)<50f?-1f:1f); turnPerStep=0.99f*turnPerStep+0.01f*newTurnPerStep; if(grid[(int)(position.x+step*heading.x)][(int)(position.y+step*heading.y)]>0){ position = new Vec3D(random(800f),random(800f),0f); heading = new Vec3D(random(-1f,1f),random(-1f,1f),0f); heading.normalize(); prevPosition.set(position); prevHeading.set(heading); overEdge=false; age=1.0f; step=1.0f; newTurnPerStep=turnPerStep=random(0.005f)*(random(100f)<50f?-1f:1f); } grid[(int)position.x][(int)position.y]++; } void draw(color[][] colorGrid){ noStroke(); ellipse(position.x,position.y,age,age); stroke(colorGrid[(int)position.x][(int)position.y]); float randomL = random(age*10.0f); line(position.x/*-randomL*heading.y*/,position.y/*+randomL*heading.x*/,position.x+randomL*heading.y,position.y-randomL*heading.x); ellipse(position.x-randomL*heading.y,position.y+randomL*heading.x,0.5f*age,0.5f*age); //ellipse(position.x+randomL*heading.y,position.y-randomL*heading.x,0.5f*age,0.5f*age); } }