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.

Spring2D s1, s2;

float gravity = 9.0;
float mass = 2.0;

void setup() {
  size(640, 360);
  fill(255, 126);
  // 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() {
  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 = 30;
  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) {
    ellipse(x, y, radius*2, radius*2);
    line(x, y, nx, ny);

Functions Used


Sets the color used to fill shapes

Learn More

Sets the color used to draw lines and borders around shapes

Learn More

Defines the dimension of the display window width and height in units of pixels

Learn More

Draws an ellipse (oval) to the screen

Learn More

The setup() function is run once, when the program starts

Learn More

Called directly after setup(), the draw() function continuously executes the lines of code contained inside its block until the program is stopped or noLoop() is called

Learn More

Disables drawing the stroke (outline)

Learn More

Draws a line (a direct path between two points) to the screen

Learn More

The background() function sets the color used for the background of the Processing window

Learn More