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.

Original Processing.org Example: Chain

// 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);

  }

}
Fork me on GitHub