topical media & game development

talk show tell print

graphic-processing-site-examples-Topics-Simulate-Chain-Chain.pde / pde



  
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.

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


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.