// Based on Greenberg 11-16 Spring[] segments = new Spring[30]; void setup() { size(400,400); smooth(); // Construct segments, with size and spring parameters depending on position along worm for (int i=0; i segments.length/2) r = segments.length-i; // smaller toward either end else r = i; // These numbers are pretty magical, from Greenberg segments[i] = new Spring(width/2, height/2, r, .0035*(i+1), .95-.02*i); } } void draw() { background(0); for (int i=0; i0) segments[0].update(segments[0].x+speed*dx/d, segments[0].y+speed*dy/d); // Recenter each following segment at preceding segment for (int i=1; i