Я хорошо понимаю линейную интерполяцию, но мне было трудно понять сложность математики сплайнов. Вот почему я искал какую-то библиотеку, которая бы обеспечивала абстракцию для сокрытия трудной математики. Следующая функция оказалась достаточной для моих нужд. Это основано на уравнении, найденном в http://www.mvps.org/directx/articles/catmull/, но, к счастью, вам не нужно понимать, как оно работает. Просто помните, что в отличие от линейной интерполяции, когда для начала вам нужны только две точки, сплайн-интерполяция Catmull-Rom использует дополнительную точку на обоих концах. Так что если вы хотите сплайн, который проходит через 10 точек, вам нужно 12.
Эта функция демонстрирует сплайн-интерполяцию Катмулла-Рома в одном измерении. (Для 2 или 3 измерений просто повторите, используя значения Y или Z.) Эта функция даст нам точку на сплайне между p1 и p2, где t - пропорция расстояния между ними.
public class SplineTest {
// Catmull-Rom spline interpolation function
public static double q(double t, double p0, double p1, double p2, double p3) {
return 0.5 * ((2 * p1) + (-p0 + p2) * t
+ (2 * p0 - 5 * p1 + 4 * p2 - p3) * (t * t) + (-p0 + 3 * p1 - 3
* p2 + p3)
* (t * t * t));
}
public static void main(String[] args) {
double t = 0.0;
while (t <= 1.0) {
System.out.println(q(t, 5, 10, 20, 10));
t += 0.1;
}
}
}
Эта программа выводит:
10.0
10.887500000000001
12.0
13.2625
14.6
15.9375
17.2
18.3125
19.2
19.7875
20.000000000000004