1 使用de Casteljau算法实现的三次贝塞尔曲线插值函数

de Casteljau算法的基本思想是通过递归地计算一系列中间点来逼近贝塞尔曲线上的点。对于n次贝塞尔曲线,算法需要进行n次递归计算。每次递归计算都会生成一组新的中间点,直到最后得到曲线上的一个点。de Casteljau算法的优点是它可以直接计算贝塞尔曲线上的点,而不需要求解高阶多项式方程。这使得它在计算机图形学和动画领域具有很高的实用价值。

de Casteljau算法的步骤如下:

  1. 对于给定的控制点集合P0, P1, ..., Pn,选择一个参数t(0 <= t <= 1),表示插值的位置。
  2. 对于每个相邻的控制点对(Pi, Pi+1),计算它们的线性插值点Qi:
    Qi = (1 - t) * Pi + t * Pi+1
  3. 重复步骤2,直到只剩下一个点。这个点就是贝塞尔曲线上对应于参数t的点。

相应的算法代码如下:

#include <iostream>
#include <vector>
#include <algorithm>

/**
 * @brief 使用de Casteljau算法实现的三次贝塞尔曲线插值函数
 * 
 * @param s 单位插值参数,范围为[0,1]
 * @param f0 控制点1
 * @param f1 控制点2
 * @param f2 控制点3
 * @param f3 控制点4
 * @return 返回s对应的插值数值
 */
float BezierInterpolateUseDeCasteljau(
    float_t s,
    float_t f0,
    float_t f1,
    float_t f2,
    float_t f3
) {
    float_t A = f0 + s * (f1 - f0);
    float_t B = f1 + s * (f2 - f1);
    float_t C = A + s * (B - A);
    return(C + s * ((B + s * ((f2 + s * (f3 - f2)) - B)) - C));
}

int main() {

    float duration = 1.0;
    float current_time = 0.0;

    while (current_time < duration)
    {
        float value = BezierInterpolateUseDeCasteljau(current_time, 0.0, 10.0, 20.0, 5.0);
        std::cout << "vaule = " << value << std::endl;

        current_time += 0.01;
    }

    return 0;
}