P.applySpring = function () {
const {particleFrom, particleTo, particleFromIsStatic, particleToIsStatic, springConstant, damperConstant, restLength} = this;
if (particleFrom && particleTo) {
const {position: fromPosition, velocity: fromVelocity, load: fromLoad} = particleFrom;
const {position: toPosition, velocity: toVelocity, load: toLoad} = particleTo;
const dVelocity = requestVector(toVelocity).vectorSubtract(fromVelocity),
dPosition = requestVector(toPosition).vectorSubtract(fromPosition);
const firstNorm = requestVector(dPosition).normalize(),
secondNorm = requestVector(firstNorm);
firstNorm.scalarMultiply(springConstant * (dPosition.getMagnitude() - restLength));
dVelocity.vectorMultiply(secondNorm).scalarMultiply(damperConstant).vectorMultiply(secondNorm);
const force = requestVector(firstNorm).vectorAdd(dVelocity);
if (!particleFromIsStatic) fromLoad.vectorAdd(force);
if (!particleToIsStatic) toLoad.vectorSubtract(force);
releaseVector(dVelocity, dPosition, firstNorm, secondNorm, force);
}
};