贝塞尔曲线
贝塞尔曲线是由多个点确定一条曲线,其中,曲线一定经过第一个和最后一个点。
de Casteljau算法
假设有三个点[latex]b_0[/latex]、[latex]b_1[/latex]、[latex]b_2[/latex]。

假设一个时间t,取值为[latex][0,1][/latex]。在时间t时,在线段[latex]b_0 b_1[/latex]上取一点[latex]b_0^1[/latex],使得[latex]b_0 b_0^1:b_0^1 b_1=t:(1-t)[/latex]

同时,在线段[latex]b_1 b_2[/latex]上做同样的操作,找到一点[latex]b_1^1[/latex],使得[latex]b_1 b_1^1:b_1^1 b_2=t:(1-t)[/latex]

然后再将[latex]b_0^1 b_1^1[/latex]连起来,并在[latex]b_0^1 b_1^1[/latex]上找到一点[latex]b_0^2[/latex],使得[latex]b_0^1 b_0^2:b_0^2 b_1^1=t:(1-t)[/latex]

得到的[latex]b_0^2[/latex]就是所求曲线上的一点。将所有t取值所得到的点连起来,便是所求曲线。

这个曲线是由三个点所决定的,所以叫做二次贝塞尔曲线。
也可以由多个点来决定一条曲线,比如三次贝塞尔曲线:

代数公式
de Casteljau算法给出了一个系数金字塔:

比如二次贝塞尔曲线:
[latex]b_0^1(t)=(1-t) b_0+t b_1[/latex]
[latex]b_1^1(t)=(1-t) b_1+t b_2[/latex]
[latex]b_0^2(t)=(1-t) b_0^1+t b_1^1[/latex]
[latex]b_0^2(t)=(1-t)^2 b_0+2 t(1-t) b_1+t^2 b_2[/latex]
观察上式可知,b前的系数是对[latex](t+1-t)^n[/latex]的展开
n阶贝塞尔曲线的伯恩斯坦形式:
[latex]\mathbf{b}^n(t)=\mathbf{b}0^n(t)=\sum_{j=0}^n \mathbf{b}_j B_j^n(t)[/latex]
[latex]\mathbf{b}^n[/latex]:贝塞尔曲线阶数n(n次向量多项式)
[latex]\mathbf{b}_j[/latex]:贝塞尔控制点
[latex]B_j^n(t)[/latex]:伯恩斯坦多项式
伯恩斯坦多项式:
[latex]B_i^n(t)=\left(\begin{array}{c} n \ i \end{array}\right) t^i(1-t)^{n-i}[/latex]
该公式不仅能用在二维平面,也可用于三维空间。
性质
贝塞尔曲线的开始和结尾必定经过[latex]b_0[/latex]和[latex]b_n[/latex]
其开始和结尾处与初末端线段相切
控制点经过仿射变换后,仍能得到正确贝塞尔曲线
曲线在控制点的凸包内
分段贝塞尔曲线
当控制点变多时,曲线会变得难以控制,微小地改变一个控制点都会影响到整个曲线。
所以每四个控制点为一组,分别计算贝塞尔曲线。
四个控制点中的第一个和最后一个控制曲线的开始和结尾的位置,中间两个控制点控制曲线的形状。

这时会出现问题,在每组连接的位置,曲线会变得不平滑。
发现如果在连接处的两个向量长度相等,方向相等,曲线将在该处变得平滑,即该处的导数也连续。

C0连续:在该处连续,即两点相连 [latex]a_n=b_0[/latex]
C1连续:在该处的一阶导连续 [latex]a_n=b_0=\frac{1}{2}(a_{n-1} + b_1)[/latex]
C2连续:在该处的二阶导连续
以此类推
曲面
将贝塞尔曲线扩展到曲面,用16个控制点,即4*4个控制点来生成一个曲面。
类似双线性插值,每4个控制点为一组,先计算出t时刻4条贝塞尔曲线的点,再将这4个点作为控制点,再画出一条曲线。
将不同t取值得到的所有曲线连起来,就能得到曲面。


Comments | NOTHING