a port of the Processing Visualization Language

### Chain

One mass is attached to the mouse position and the other is attached the position of the other mass. The gravity in the environment pulls down on both.

```// All Examples Written by Casey Reas and Ben Fry

// unless otherwise stated.

Spring2D s1, s2;

float gravity = 6.0;

float mass = 2.0;

void setup()

{

size(200, 200);

smooth();

fill(0);

// Inputs: x, y, mass, gravity

s1 = new Spring2D(0.0, width/2, mass, gravity);

s2 = new Spring2D(0.0, width/2, mass, gravity);

}

void draw()

{

background(204);

s1.update(mouseX, mouseY);

s1.display(mouseX, mouseY);

s2.update(s1.x, s1.y);

s2.display(s1.x, s1.y);

}

class Spring2D {

float vx, vy; // The x- and y-axis velocities

float x, y; // The x- and y-coordinates

float gravity;

float mass;

float radius = 20;

float stiffness = 0.2;

float damping = 0.7;

Spring2D(float xpos, float ypos, float m, float g) {

x = xpos;

y = ypos;

mass = m;

gravity = g;

}

void update(float targetX, float targetY) {

float forceX = (targetX - x) * stiffness;

float ax = forceX / mass;

vx = damping * (vx + ax);

x += vx;

float forceY = (targetY - y) * stiffness;

forceY += gravity;

float ay = forceY / mass;

vy = damping * (vy + ay);

y += vy;

}

void display(float nx, float ny) {

noStroke();

ellipse(x, y, radius*2, radius*2);

stroke(255);

line(x, y, nx, ny);

}

}```