前言:
- 隐式曲线表达上的限制
- 计算上的多值性(例如可能一个 x 对应多个 y)
- 存在导数 未定义的点
- 坐标系进行变换后,曲线表达形式将可能会发生改变
- 一般的多项式幂基函数缺乏直观的几何意义
我们考虑由3个二元点对构造的二维平面曲线,其中参数变量 t∈R :
代码实现:
#include<stdio.h>
//输入参数为控制点坐标
//控制点P的个数为n+1
//t为参数值,其区间变化为0到1
//函数返回值Berzier曲线在参数为t的坐标值
double decas(double P[], int n, double t) {
int m, i;
double*R, *Q, P0;
R = &P[n + 1];
Q = &P[n + 1];
for (int i = 0; i <=n ; i++)
{
R[i] = P[i];//将控制点坐标P保存在R中
//做n次外循环
//每次循环都计算控制多边形上所有的m条边以参数t分别为分割比例的坐标值
}
for (m = n; m >0; m--)
{
//做m次内循环
//每次循环计算控制多边形上一条边以参数t为分割比例的坐标值
for ( i = 0; i <=m-1; i++)
{
//n次berzier曲线在点t的值,可由两条n-1的berzier曲线
//在点t的值通过线性组合而求得
Q[i].x = R[i].x + t * (R[i + 1].x - R[i].x);
Q[i].y = R[i].y + t * (R[i + 1].y - R[i].y);
}
for ( i = 0; i <=m-1; i++)
{
R[i] = Q[i];
}
}
P0 = R[0];
delete R;
delete Q;
return (P0);
}
//输入参数P为控制带点坐标
//控制点P的个数为n+1
//输出参数采用几何作图算法生成Bezier曲线上的离散点序列pts
//离散点序列pts的个数为npoints+1
void bez_to_points(double P[], int n, double pts[], int npoints)
{
double t, delt;
delt = 1.0 / (double)npoints;//将参数t变化区间进行npoints等分
t = 0.0;
for (int i = 0; i < npoints; i++)
{
pts[i] = decas(P, n, t);//分别求出npoints+1个离散点pts的坐标
t += delt;
}
}