- 给定一个有序的点集 P0, P1, …, Pn, 可以决定一个 n次 的Bezier曲线段
- 曲线次数 = 控制点数目 - 1
插入点 = 控制点 与 基函数 的 乘积和
Bezier曲线公式
其中的基函数或称调和函数为 Bernstein多项式:
该多项式的第一项是 组合数
Bernstein多项式
例如,由 P0、P1、P2、P3四个控制点 构成的控制多边形来构造
此时调和函数为:
三次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();
}