spring(s)


    
    function Spring(restLength, stiffness, damper, pointMassA, pointMassB)
    {
      this.restLength = restLength; 
      this.stiffness = stiffness; 
      this.damper = damper; 
      this.pointMassA = pointMassA; 
      this.pointMassB = pointMassB; 
      this.tmp = Vector(0.0, 0.0); 
      
      this.sc = function(env)
      {
        env.collistion(this.pointMassA.getPos(), this.pointMassA.getPrevPos()); 
        env.collistion(this.pointMassB.getPos(), this.pointMassB.getPrevPos()); 
      }
      
      this.move = function(dt)
      {
        var aXbX;
        var aYbY;
        var springForce; 
        var length; 
        
        aXbX = this.pointMassA.getXPos() - this.pointMassB.getXPos(); 
        aYbY = this.pointMassA.getYPos() - this.pointMassB.getYPos(); 
        
        length = Math.sqrt(aXbX * aXbX + aYbY * aYbY);
        springForce = this.stiffness * (length / this.restLength - 1.0);   
        
        var avXbvX; 
        var avYbvY; 
        var damperForce; 
        
        avXbvX = this.pointMassA.getXVel() - this.pointMassB.getXVel(); 
        avYbvY = this.pointMassA.getYVel() - this.pointMassB.getYVel(); 
        
        damperForce = avXbvX * aXbX + avYbvY * aYbY;
        damperForce *= this.damper; 
        
        var fx; 
        var fy; 
        
        fx = (springForce + damperForce) * aXbX; 
        fy = (springForce + damperForce) * aYbY; 
        
        this.tmp.setX(-fx); 
        this.tmp.setY(-ft); 
        this.pointMassA.addForce(this.tmp); 
  
        this.tmp.setX(fx); 
        this.tmp.setY(ft); 
        this.pointMassB.addForce(this.tmp); 
        
        this.pointMassA.move(dt); 
        this.pointMassB.move(dt); 
      }
      this.addForce = function(force)
      {
        this.pointMassA.addForce(force); 
        this.pointMassB.addForce(force); 
      }
      this.draw = function(ctx, scaleFactor)
      {
        this.pointMassA.draw(ctx, scaleFactor); 
        this.pointMassB.draw(ctx, scaleFactor); 
        
        ctx.fillStyle = '#000000'; 
        ctx.strokeStyle = '#000000'; 
        ctx.beginPath(); 
        ctx.moveTo(this.pointMassA.getXPos() * scaleFactor, 
                   this.pointMassA.getYPos() * scaleFactor); 
        ctx.lineTo(this.pointMassB.getXPos() * scaleFactor, 
                   this.pointMassB.getXPos() * scaleFactor); 
        ctx.stroke(); 
      }
    }