import math
from Point import Point

class Spring:
    """Physical model of a spring.
    """

    def __init__(self, m0, m1, k, l0=None, damping=None):
        """Construct a spring.
        """
        self.m0 = m0
        self.m1 = m1
        self.k = k
        if l0:
            self.l0 = l0
        else:
            self.l0 = self.m0.getPosition().DistanceTo(self.m1.getPosition())
        self.damping = damping
        self.e = Point([0,0,0])

    def calcSpringForce(self):
        """Calculate the spring force.
        """
        delta = self.m1.getPosition() - self.m0.getPosition()
        l = delta.Length()
        self.e = delta.Normalized()
        # Fspring = (l - l0) * k
        Fspring = self.e * (l - self.l0) * self.k
        self.m0.F += Fspring
        self.m1.F -= Fspring

    def calcDampingForce(self):
        """Calculate the damping force.
        """
        if self.damping:
            # Fdamping = v in e * dampingFactor
            Fdamping = self.e.Dot(self.m1.v - self.m0.v) * self.damping * self.e
            self.m0.F += Fdamping
            self.m1.F -= Fdamping

    def Print(self):
        self.e.Print()

    def SetSpringConstant(self,k):
        self.k = k
        
