stick(s)


      
    function Stick(pointMassA, pointMassB)
    {
      function pointMassDist(pointMassA, pointMassB)
      {
        var aXbX, aYbY; 
      
        aXbX = pointMassA.getXPos() - pointMassB.getXPos(); 
        aYbY = pointMassA.getYPos() - pointMassB.getYPos(); 
      
        return Math.sqrt(aXbX * aXbX + aYbY * aYbY);  
      }
    
      this.length = pointMassDist(pointMassA, pointMassB); 
      this.lengthSquared = this.length * this.length; 
      this.pointMassA = pointMassA; 
      this.pointMassB = pointMassB; 
      this.delta = new Vector(0.0, 0.0); 
      
      this.getPointMassA = function()
      {
        return this.pointMassA; 
      }
      this.getPointMassB = function()
      {
        return this.pointMassB; 
      }
      this.scale = function(scaleFactor)
      {
        this.length *= scaleFactor; 
        this.lengthSquared = this.length * this.length; 
      }
      this.sc = function(env)
      {
        var dotProd, scaleFactor; 
        var pointMassAPos, pointMassBPos; 
      
        pointMassAPos = this.pointMassA.getPos(); 
        pointMassBPos = this.pointMassB.getPos(); 
      
        this.delta.set(pointMassBPos); 
        this.delta.sub(pointMassAPos); 
  
        dotProd = this.delta.dotProd(this.delta); 
  
        scaleFactor = this.lengthSquared / (dotProd + this.lengthSquared) - 0.5; 
        this.delta.scale(scaleFactor);
         
        pointMassAPos.sub(this.delta); 
        pointMassBPos.add(this.delta); 
      }
      this.setForce = function(force)
      {
        this.pointMassA.setForce(force); 
        this.pointMassB.setForce(force); 
      }
      this.addForce = function(force)
      {
        this.pointMassA.addForce(force); 
        this.pointMassB.addForce(force); 
      }
      this.move = function(dt)
      {
        this.pointMassA.move(dt); 
        this.pointMassB.move(dt); 
      }
      this.draw = function(ctx, scaleFactor)
      {
        this.pointMassA.draw(ctx, scaleFactor); 
        this.pointMassB.draw(ctx, scaleFactor); 
              
        ctx.lineWidth = 3; 
        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.getYPos() * scaleFactor); 
        ctx.stroke(); 
      }
    }