P.applySpring = function () {
const { particleFrom, particleTo, particleFromIsStatic, particleToIsStatic, springConstant, damperConstant, restLength } = this;
if (!(particleFrom && particleTo)) return;
const { position: fromPos, velocity: fromVel, load: fromLoad } = particleFrom;
const { position: toPos, velocity: toVel, load: toLoad } = particleTo;
const dPos = requestVector(toPos).vectorSubtract(fromPos);
const len = dPos.getMagnitude();
if (!len) {
releaseVector(dPos);
return;
}
const n = requestVector(dPos).normalize();
const dVel = requestVector(toVel).vectorSubtract(fromVel);
const force = requestVector(n).scalarMultiply(springConstant * (len - restLength));
const vAlong = dVel.getDot(n);
force.vectorAddScaled(n, damperConstant * vAlong);
if (!particleFromIsStatic)fromLoad.vectorAdd(force);
if (!particleToIsStatic) toLoad.vectorSubtract(force);
releaseVector(dPos, n, dVel, force);
};