class Spring { Mass a,b; float restLength; Spring(Mass a,Mass b) { this.a = a; this.b = b; restLength = a.distanceTo(b); } void display() { if (this == overSpring) { stroke(0x00,0x99,0xFF); float vx = b.x-a.x; float vy = b.y-a.y; float dot = (vx*vx + vy*vy); float rx = mouseX-a.x; float ry = mouseY-a.y; float dot2 = (vx*rx + vy*ry); float value = dot2/dot; value = min(value,1); value = max(value,0); float x = ((b.x*value)+(a.x*(1-value))); float y = ((b.y*value)+(a.y*(1-value))); line(x,y,mouseX,mouseY); } else { stroke(0); } line(a.x,a.y,b.x,b.y); } void applyForces() { double d = a.distanceTo(b); if (d>0) { double f = (d-restLength)*k.value; double fH = (f/d)*(a.x-b.x); double fV = (f/d)*(a.y-b.y); a.xv -= fH; a.yv -= fV; b.xv += fH; b.yv += fV; } } float distanceTo(float x,float y) { if (x>(min(a.x,b.x)-mouseTolerance) &&x<(max(a.x,b.x)+mouseTolerance) &&y>(min(a.y,b.y)-mouseTolerance) &&y<(max(a.y,b.y)+mouseTolerance)) { float vx = b.x-a.x; float vy = b.y-a.y; float dot = (vx*vx + vy*vy); float rx = x-a.x; float ry = y-a.y; float dot2 = (vx*rx + vy*ry); float value = dot2/dot; if (value<0) { float d = a.distanceTo(x,y); return d <= mouseTolerance?d:-1; } else if (value>1) { float d = b.distanceTo(x,y); return d <= mouseTolerance?d:-1; } float px = ((b.x*value)+(a.x*(1-value)))-x; float py = ((b.y*value)+(a.y*(1-value)))-y; float d = sqrt(px*px+py*py); return d <= mouseTolerance?d:-1; } else return -1; } }