position method
Position at time t (seconds).
Implementation
@override
double position(double t) {
if (t <= 0) return from;
final delta = from - to;
if (_zeta < 1.0) {
// Under-damped: oscillatory decay
final envelope = math.exp(-_zeta * _omega0 * t);
final phase = _omegaD * t;
final cosCoeff = delta;
final sinCoeff =
(initialVelocity + _zeta * _omega0 * delta) / _omegaD;
return to +
envelope *
(cosCoeff * math.cos(phase) + sinCoeff * math.sin(phase));
} else if ((_zeta - 1.0).abs() < 0.001) {
// Critically damped: fastest non-oscillatory settle
final envelope = math.exp(-_omega0 * t);
return to +
envelope * (delta + (initialVelocity + _omega0 * delta) * t);
} else {
// Over-damped: two exponential decays
final sqrtTerm = math.sqrt(_zeta * _zeta - 1.0);
final r1 = -_omega0 * (_zeta - sqrtTerm);
final r2 = -_omega0 * (_zeta + sqrtTerm);
final c1 = (initialVelocity - r2 * delta) / (r1 - r2);
final c2 = delta - c1;
return to + c1 * math.exp(r1 * t) + c2 * math.exp(r2 * t);
}
}