Particle[] p; Force gravity; float friction; float restitution; boolean SAVING; int saveLag; framePoster fPost = new framePoster("verletchain","verletchain"); void setup(){ size(600,600); background(255); p = new Particle[40]; for(int i=0;i<40;i++){ p[i]=new Particle(10.0f+6.0f*i,600.0f,10.0f+6.0f*i,600.0f); } gravity = new Force(0.0f,0.0f); friction=0.1f; restitution=1.0f; fill(0); rect(0,0,600,600); fill(255); rect(4,4,592,592); noFill(); for(int c=0;c<40;c++){ for(int i=1;i<40;i++){ p[i].update(gravity,friction); } for(int r=0;r<1;r++){ fixlengthpivot(p[0],p[1],10.0f); for(int i=1;i<39;i++){ p[i].constrain(0.0f,600.0f,restitution); fixlength(p[i],p[i+1],10.0f); } } } SAVING=false; saveLag=10; } void draw(){ for(int c=0;c<10;c++){ noStroke(); fill(200,0,0,20); if(random(1.0f)<0.1f) ellipse(p[0].x, p[0].y,8,8); for(int i=0;i<39;i++){ stroke(max(0,200-i*40),0,0,10); line(p[i].x, p[i].y,p[i+1].x, p[i+1].y); } for(int i=1;i<40;i++){ p[i].update(gravity,friction); } for(int r=0;r<4;r++){ fixlengthpivot(p[0],p[1],10.0f); for(int i=1;i<39;i++){ p[i].constrain(0.0f,600.0f,restitution); fixlength(p[i],p[i+1],10.0f); } } } if(SAVING) saveLag--; if(saveLag<=0){ SAVING=false; saveLag=10; } } void fixlength(Particle a, Particle b, float l){ float d1 = dist(a.x,a.y,b.x,b.y); float d2 = 0.5*(d1-l)/d1; float dx=(b.x-a.x)*d2; float dy=(b.y-a.y)*d2; a.x+=dx; a.y+=dy; b.x-=dx; b.y-=dy; } void fixlengthpivot(Particle a, Particle b, float l){ float d1 = dist(a.x,a.y,b.x,b.y); float d2 = (d1-l)/d1; float dx=(b.x-a.x)*d2; float dy=(b.y-a.y)*d2; b.x-=dx; b.y-=dy; } void mouseDragged(){ int mx=constrain(mouseX,0,600); int my=constrain(mouseY,0,6000); for(int i=0;i<40;i++){ p[i].x += mx - p[0].x; p[i].y += my - p[0].y; } } void keyPressed(){ if(key==' '){ filter(BLUR,1); fill(255,20); rect(4,4,592,592); } else if (((key == 's')||(key == 'S'))&&(!SAVING)) { SAVING=true; fPost.postFrame(); } else{ fill(0); rect(0,0,600,600); fill(255); rect(4,4,592,592); for(int i=0;i<40;i++){ p[i]=new Particle(10.0f+6.0f*i,600.0f,10.0f+6.0f*i,600.0f); } for(int c=0;c<40;c++){ for(int i=1;i<40;i++){ p[i].update(gravity,friction); } for(int r=0;r<1;r++){ fixlengthpivot(p[0],p[1],10.0f); for(int i=1;i<39;i++){ p[i].constrain(0.0f,600.0f,restitution); fixlength(p[i],p[i+1],10.0f); } } } } }