Bezier曲线

  • 给定一个有序的点集 P0, P1, …, Pn, 可以决定一个 n次 的Bezier曲线段
  • 曲线次数 = 控制点数目 - 1

插入点 = 控制点基函数乘积和

Bezier曲线公式

其中的基函数或称调和函数为 Bernstein多项式
该多项式的第一项是 组合数

Bernstein多项式

例如,由 P0、P1、P2、P3四个控制点 构成的控制多边形来构造
此时调和函数为:

Bezier曲线_第1张图片
三次Bezier曲线调和函数
// 画贝叶斯曲线
void drawBezierCurve() {

    double *base = new double[b.degree + 1];            // 存储基函数值

    Point2D *insert_points = new Point2D[insertNum];    // 存储插入点

    double step = 1.0 / (insertNum - 1);                // 插值点步长,均匀插值

    int j = 0;
    for (double t = 0.0; t <= 1.0; t += step) {
        for (int i = 0; i <= b.degree; ++i) {
            base[i] = C(b.degree, i) * pow(t, i) * pow(1 - t, b.degree - i);    // 组合数系数*后两项
            insert_points[j].x += base[i] * b.cnt_points[i].x;                  // 控制点数 = 次数+1
            insert_points[j].y += base[i] * b.cnt_points[i].y;
        }
        j++;
    }

    glColor3f(0.0, 1.0, 0.0);
    glLineWidth(2);
    glBegin(GL_LINE_STRIP);
    for (int i = 0; i < insertNum; i++)
    {
        glVertex2f(insert_points[i].x, insert_points[i].y);
    }
    glEnd();
}

你可能感兴趣的:(Bezier曲线)