topical media & game development

talk show tell print

#javascript-processing-example-topic-simulate-springs.htm / htm



  <!DOCTYPE html>
  <html><head>
  <script src="javascript-processing-example-processing.js"></script>
  <script src="javascript-processing-example-init.js"></script>
  <link rel="stylesheet" href="javascript-processing-example-style.css">
  </head><body><h1><a href="http://ejohn.org/blog/processingjs/">Processing.js</a></h1>
  <h2>Springs</h2>
  
  <p>Move the mouse over one of the circles and click to re-position. 
  When you release the mouse, it will snap back into position. 
  Each circle has a slightly different behavior.</p>
  
  <p><a href="http://processing.org/learning/topics/springs.html"><b>Original Processing.org Example:</b> Springs</a><br>
  <script type="application/processing">
  int num = 3; 
  Spring[] springs = new Spring[num]; 
  
  void setup()
  {
    size(200, 200);
    noStroke(); 
    smooth();
    springs[0] = new Spring( 70, 160,  20, 0.98, 8.0, 0.1, springs, 0); 
    springs[1] = new Spring(150, 110,  60, 0.95, 9.0, 0.1, springs, 1); 
    springs[2] = new Spring( 40,  70, 120, 0.90, 9.9, 0.1, springs, 2);   
  }
  
  void draw() 
  {
    background(51); 
    
    for (int i=0; i<num; i++) { 
      springs[i].update(); 
      springs[i].display(); 
    }  
  }
  
  void mousePressed() 
  {
    for (int i=0; i<num; i++) { 
      springs[i].pressed(); 
    } 
  }
  
  void mouseReleased() 
  {
    for (int i=0; i<num; i++) { 
      springs[i].released(); 
    } 
  }
  
  class Spring 
  { 
    // Screen values 
    float xpos, ypos;
    float tempxpos, tempypos; 
    int size = 20; 
    boolean isOver = false; 
    boolean move = false; 
  
    // Spring simulation constants 
    float mass;       // Mass 
    float k = 0.2;    // Spring constant 
    float damp;       // Damping 
    float rest_posx;  // Rest position X 
    float rest_posy;  // Rest position Y 
  
    // Spring simulation variables 
    //float pos = 20.0; // Position 
    float velx = 0.0;   // X Velocity 
    float vely = 0.0;   // Y Velocity 
    float accel = 0;    // Acceleration 
    float force = 0;    // Force 
  
    Spring[] friends;
    int me;
    
    // Constructor
    Spring(float x, float y, int s, float d, float m, 
           float k_in, Spring[] others, int id) 
    { 
      xpos = tempxpos = x; 
      ypos = tempypos = y;
      rest_posx = x;
      rest_posy = y;
      size = s;
      damp = d; 
      mass = m; 
      k = k_in;
      friends = others;
      me = id; 
    } 
  
    void update() 
    { 
      if (move) { 
        rest_posy = mouseY; 
        rest_posx = mouseX;
      } 
  
      force = -k * (tempypos - rest_posy);  // f=-ky 
      accel = force / mass;                 // Set the acceleration, f=ma == a=f/m 
      vely = damp * (vely + accel);         // Set the velocity 
      tempypos = tempypos + vely;           // Updated position 
  
      force = -k * (tempxpos - rest_posx);  // f=-ky 
      accel = force / mass;                 // Set the acceleration, f=ma == a=f/m 
      velx = damp * (velx + accel);         // Set the velocity 
      tempxpos = tempxpos + velx;           // Updated position 
  
      
      if ((over() || move) && !otherOver() ) { 
        isOver = true; 
      } else { 
        isOver = false; 
      } 
    } 
    
    // Test to see if mouse is over this spring
    boolean over() {
      float disX = tempxpos - mouseX;
      float disY = tempypos - mouseY;
      if (sqrt(sq(disX) + sq(disY)) < size/2 ) {
        return true;
      } else {
        return false;
      }
    }
    
    // Make sure no other springs are active
    boolean otherOver() {
      for (int i=0; i<num; i++) {
        if (i != me) {
          if (friends[i].isOver == true) {
            return true;
          }
        }
      }
      return false;
    }
  
    void display() 
    { 
      if (isOver) { 
        fill(153); 
      } else { 
        fill(255); 
      } 
      ellipse(tempxpos, tempypos, size, size);
    } 
  
    void pressed() 
    { 
      if (isOver) { 
        move = true; 
      } else { 
        move = false; 
      }  
    } 
  
    void released() 
    { 
      move = false; 
      rest_posx = xpos;
      rest_posy = ypos;
    } 
  }
  </script><canvas width="200" height="200"></canvas></p>
  <div style="overflow: hidden; height: 0px; width: 0px;"></div>
  
  <pre><b>// All Examples Written by <a href="http://reas.com/">Casey Reas</a> and <a href="http://benfry.com/">Ben Fry</a>
  // unless otherwise stated.</b>
  int num = 3; 
  Spring[] springs = new Spring[num]; 
  
  void setup()
  {
    size(200, 200);
    noStroke(); 
    smooth();
    springs[0] = new Spring( 70, 160,  20, 0.98, 8.0, 0.1, springs, 0); 
    springs[1] = new Spring(150, 110,  60, 0.95, 9.0, 0.1, springs, 1); 
    springs[2] = new Spring( 40,  70, 120, 0.90, 9.9, 0.1, springs, 2);   
  }
  
  void draw() 
  {
    background(51); 
    
    for (int i=0; i&lt;num; i++) { 
      springs[i].update(); 
      springs[i].display(); 
    }  
  }
  
  void mousePressed() 
  {
    for (int i=0; i&lt;num; i++) { 
      springs[i].pressed(); 
    } 
  }
  
  void mouseReleased() 
  {
    for (int i=0; i&lt;num; i++) { 
      springs[i].released(); 
    } 
  }
  
  class Spring 
  { 
    // Screen values 
    float xpos, ypos;
    float tempxpos, tempypos; 
    int size = 20; 
    boolean isOver = false; 
    boolean move = false; 
  
    // Spring simulation constants 
    float mass;       // Mass 
    float k = 0.2;    // Spring constant 
    float damp;       // Damping 
    float rest_posx;  // Rest position X 
    float rest_posy;  // Rest position Y 
  
    // Spring simulation variables 
    //float pos = 20.0; // Position 
    float velx = 0.0;   // X Velocity 
    float vely = 0.0;   // Y Velocity 
    float accel = 0;    // Acceleration 
    float force = 0;    // Force 
  
    Spring[] friends;
    int me;
    
    // Constructor
    Spring(float x, float y, int s, float d, float m, 
           float k_in, Spring[] others, int id) 
    { 
      xpos = tempxpos = x; 
      ypos = tempypos = y;
      rest_posx = x;
      rest_posy = y;
      size = s;
      damp = d; 
      mass = m; 
      k = k_in;
      friends = others;
      me = id; 
    } 
  
    void update() 
    { 
      if (move) { 
        rest_posy = mouseY; 
        rest_posx = mouseX;
      } 
  
      force = -k * (tempypos - rest_posy);  // f=-ky 
      accel = force / mass;                 // Set the acceleration, f=ma == a=f/m 
      vely = damp * (vely + accel);         // Set the velocity 
      tempypos = tempypos + vely;           // Updated position 
  
      force = -k * (tempxpos - rest_posx);  // f=-ky 
      accel = force / mass;                 // Set the acceleration, f=ma == a=f/m 
      velx = damp * (velx + accel);         // Set the velocity 
      tempxpos = tempxpos + velx;           // Updated position 
  
      
      if ((over() || move) &amp;&amp; !otherOver() ) { 
        isOver = true; 
      } else { 
        isOver = false; 
      } 
    } 
    
    // Test to see if mouse is over this spring
    boolean over() {
      float disX = tempxpos - mouseX;
      float disY = tempypos - mouseY;
      if (sqrt(sq(disX) + sq(disY)) &lt; size/2 ) {
        return true;
      } else {
        return false;
      }
    }
    
    // Make sure no other springs are active
    boolean otherOver() {
      for (int i=0; i&lt;num; i++) {
        if (i != me) {
          if (friends[i].isOver == true) {
            return true;
          }
        }
      }
      return false;
    }
  
    void display() 
    { 
      if (isOver) { 
        fill(153); 
      } else { 
        fill(255); 
      } 
      ellipse(tempxpos, tempypos, size, size);
    } 
  
    void pressed() 
    { 
      if (isOver) { 
        move = true; 
      } else { 
        move = false; 
      }  
    } 
  
    void released() 
    { 
      move = false; 
      rest_posx = xpos;
      rest_posy = ypos;
    } 
  }</pre>
  </body></html>
  


(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.