TVector MassSpringCurve<Real,TVector>::Acceleration (int i, Real time, const TVector* positions, const TVector* velocities) { // Compute spring forces on position X[i]. The positions are not // necessarily m_akPosition since the RK4 solver in ParticleSystem // evaluates the acceleration function at intermediate positions. The end // points of the curve of masses must be handled separately since each // has only one spring attached to it. TVector acceleration = ExternalAcceleration(i, time, positions, velocities); TVector diff, force; Real ratio; if (i > 0) { int iM1 = i-1; diff = positions[iM1] - positions[i]; ratio = mLengths[iM1]/diff.Length(); force = mConstants[iM1]*((Real)1 - ratio)*diff; acceleration += mInvMasses[i]*force; } int iP1 = i+1; if (iP1 < mNumParticles) { diff = positions[iP1] - positions[i]; ratio = mLengths[i]/diff.Length(); force = mConstants[i]*((Real)1 - ratio)*diff; acceleration += mInvMasses[i]*force; } return acceleration; }
TVector MassSpringArbitrary<Real,TVector>::Acceleration (int i, Real time, const TVector* positions, const TVector* velocities) { // Compute spring forces on position X[i]. The positions are not // necessarily m_akPosition since the RK4 solver in ParticleSystem // evaluates the acceleration function at intermediate positions. TVector acceleration = ExternalAcceleration(i, time, positions, velocities); TVector diff, force; Real ratio; std::set<int>::iterator iter = mAdjacent[i].begin(); std::set<int>::iterator end = mAdjacent[i].end(); for (/**/; iter != end; ++iter) { // Process a spring connected to particle i. const Spring& spring = mSprings[*iter]; if (i != spring.Particle0) { diff = positions[spring.Particle0] - positions[i]; } else { diff = positions[spring.Particle1] - positions[i]; } ratio = spring.Length/diff.Length(); force = spring.Constant*((Real)1 - ratio)*diff; acceleration += mInvMasses[i]*force; } return acceleration; }