Thay vì beziers, bạn có thể muốn spline b-splines hoặc catmull-rom.
float bspline(float t, float p0, float p1, float p2, float p3)
{
float it = 1.0f - t;
float b0 = it*it*it * (1.0f / 6.0f);
float b1 = (3*t*t*t - 6*t*t +4) * (1.0f / 6.0f);
float b2 = (-3*t*t*t +3*t*t + 3*t + 1) * (1.0f / 6.0f);
float b3 = t*t*t * (1.0f / 6.0f);
return
b0*p0 +
b1*p1 +
b2*p2 +
b3*p3;
}
float catmullrom(float t, float p0, float p1, float p2, float p3)
{
return 0.5f * (
(2 * p1) +
(-p0 + p2) * t +
(2 * p0 - 5 * p1 + 4 * p2 - p3) * t * t +
(-p0 + 3 * p1 - 3 * p2 + p3) * t * t * t
);
}
Cách sử dụng: t nằm trong khoảng từ 0 đến 1, trong đó giá trị nội suy spline giữa hai điểm điều khiển và các phao p0, p1, p2 và p3 đại diện cho các điểm điều khiển (trước, hiện tại, tiếp theo và sau). Để nội suy các đường cong n chiều, chỉ cần gọi các hàm một lần trên mỗi trục.
Sự khác biệt thực tế giữa bsplines và catmull-rom về cơ bản là catmull-rom đi qua tất cả các điểm kiểm soát trong khi bsplines trơn tru hơn.