position method

  1. @override
double position(
  1. double t
)
override

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);
  }
}