interpolateBasis function

Interpolator<double> interpolateBasis(
  1. List<double> values
)

Creates a basis spline interpolator.

Implementation

Interpolator<double> interpolateBasis(List<double> values) {
  final n = values.length - 1;

  double basis(double t1, double v0, double v1, double v2, double v3) {
    final t2 = t1 * t1;
    final t3 = t2 * t1;
    return ((1 - 3 * t1 + 3 * t2 - t3) * v0 +
            (4 - 6 * t2 + 3 * t3) * v1 +
            (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 +
            t3 * v3) /
        6;
  }

  return (double t) {
    if (t <= 0) return values.first;
    if (t >= 1) return values.last;

    final i = (t * n).floor();
    final localT = t * n - i;

    final v0 = i > 0 ? values[i - 1] : 2 * values[i] - values[i + 1];
    final v1 = values[i];
    final v2 = values[i + 1];
    final v3 = i < n - 1 ? values[i + 2] : 2 * values[i + 1] - values[i];

    return basis(localT, v0, v1, v2, v3);
  };
}