由于幂基和Bezier形式都以多项式函数作为坐标函数,因此,它们在数学上是等价的,即:以其中一种形式表示的曲线也可以表示为另一张形式。但是,当用于几何造型时,Bezier形式比幂基形式优越。
幂基形式具有如下缺点:
一条 n n n次Bezier曲线可以表示为
C ( u ) = ∑ i = 0 n B i , n ( u ) P i , 0 ⩽ u ⩽ 1 ( 1.7 ) \mathbf{C}(u)=\sum\limits_{i=0}^n B_{i,n}(u)\mathbf{P}_i,\quad0\leqslant u\leqslant1\quad(1.7) C(u)=i=0∑nBi,n(u)Pi,0⩽u⩽1(1.7)
其中,基函数(也称为混合函数) { B i , n ( u ) } \{B_{i,n}(u)\} {Bi,n(u)}是著名的 n n n次Bernstein多项式,其定义为
B i , n ( u ) = n ! i ! ( n − i ) ! u i ( 1 − u ) n − i ( 1.8 ) B_{i,n}(u)=\frac{n!}{i!(n-i)!}u^i(1-u)^{n-i}\quad(1.8) Bi,n(u)=i!(n−i)!n!ui(1−u)n−i(1.8)
(1.7)式中的几何系数 { P i } \{P_i\} {Pi}称为控制点。注意:在定义(1.7)式中,要求 u ∈ [ 0 , 1 ] \boldsymbol{u}\in\begin{bmatrix}0,1\end{bmatrix} u∈[0,1]。
当 n = 1 n=1 n=1时,由(1.8)式有 B 0 , 1 ( u ) = 1 − u B_{0,1}\left(\begin{matrix}u\end{matrix}\right)=1-u B0,1(u)=1−u和 B 1 , 1 ( u ) = u B_{1,1}\left(\begin{matrix}u\end{matrix}\right)=u B1,1(u)=u,由(1.7)式可得 C ( u ) = ( 1 − u ) P 0 + u P 1 \mathbf{C}(u)=(1-u)\mathbf{P}_{0}+u\mathbf{P}_{1} C(u)=(1−u)P0+uP1,这是一段由 P 0 P_0 P0到 P 1 P_1 P1的直线段。
当 n = 2 n=2 n=2时,由(1.7)和(1.8)式可得 C ( u ) = ( 1 − u ) 2 P 0 + 2 u ( 1 − u ) P 1 + ( u ) 2 P 2 \mathbf{C}(u)=(1-u)^{2}\mathbf{P}_{0}+2u(1-u)\mathbf{P}_{1}+(u)^{2}\mathbf{P}_{2} C(u)=(1−u)2P0+2u(1−u)P1+(u)2P2,这是一段由 P 0 P_0 P0到 P 2 P_2 P2的抛物线弧。我们注意到:
当 n = 3 n=3 n=3时,我们有 C ( u ) = ( 1 − u ) 3 P 0 + 3 u ( 1 − u ) 2 P 1 + 3 u 2 ( 1 − u ) P 2 + u 3 P 3 \mathbf{C}(u)=(1-u)^{3}\mathbf{P}_{0}+3u(1-u)^{2}\mathbf{P}_{1}+3u^{2}(1-u)\mathbf{P}_{2}+u^{3}\mathbf{P}_{3} C(u)=(1−u)3P0+3u(1−u)2P1+3u2(1−u)P2+u3P3,三次Bezier曲线,我们注意到:
除了前面提到的性质,Bezier曲线在通常的变换(平移、旋转、缩放)下具有几何不变性,即:要对Bezier曲线进行上述变换,只需对其各个控制点进行该变换即可实现。
在任何一种曲线曲面的表示方法中,基函数的选择决定了曲线的几何特性。基函数一般具有一下性质:
Bezier曲线求导的一般公式
C ′ ( u ) = d ( ∑ i = 0 n B i . . . n ( u ) P i ) d u = ∑ i = 0 n B i . . . n ′ ( u ) P i = ∑ i = 0 n n ( B i − 1 , n − 1 ( u ) − B i , n − 1 ( u ) ) P i = n ∑ i = 0 n − 1 B i , n − 1 ( u ) ( P i + 1 − P i ) ( 1.9 ) \begin{aligned}\mathbf{C}^{\prime}(u)&=\frac{\mathrm{d}\Big(\sum_{i=0}^{n}B_{i...n}(\mathbf{u})\mathbf{P}_{i}\Big)}{\mathrm{d}\mathbf{u}}=\sum_{i=0}^{n}B_{i...n}^{\prime}(\mathbf{u})\mathbf{P}_{i} \\&=\sum\limits_{i=0}^n n(B_{i-1,n-1}(u)-B_{i,n-1}(u))\mathbf{P}_i \\&=n\sum\limits_{i=0}^{n-1}B_{i,n-1}(u)(\mathbf{P}_{i+1}-\mathbf{P}_i)& (1.9) \end{aligned} C′(u)=dud(∑i=0nBi...n(u)Pi)=i=0∑nBi...n′(u)Pi=i=0∑nn(Bi−1,n−1(u)−Bi,n−1(u))Pi=ni=0∑n−1Bi,n−1(u)(Pi+1−Pi)(1.9)
由(1.9)式容易得到Bezier曲线在两个端点处导矢的公式
C ′ ( 0 ) = n ( P 1 − P 0 ) C ′ ′ ( 0 ) = n ( n − 1 ) ( P 0 − 2 P 1 + P 0 ) C ′ ( 1 ) = n ( P n − P n − 1 ) C ′ ′ ( 1 ) = n ( n − 1 ) ( P n − 2 P n − 1 + P n − 2 ) ( 1.10 ) \begin{aligned}&\mathbf{C}^{\prime}(0) =n(\mathbf{P}_{1}-\mathbf{P}_{0})\quad\mathbf{C}^{\prime\prime}(0)=n(\mathbf{n}-1)\left(\mathbf{P}_{0}-2\mathbf{P}_{1}+\mathbf{P}_{0}\right) \\&\mathbf{C}'(1) =n(\mathbf{P}_{n}-\mathbf{P}_{n-1})\quad\mathbf{C}^{\prime\prime}(1)=n(n-1)(\mathbf{P}_{n}-2\mathbf{P}_{n-1}+\mathbf{P}_{n-2}) & (1.10)\end{aligned} C′(0)=n(P1−P0)C′′(0)=n(n−1)(P0−2P1+P0)C′(1)=n(Pn−Pn−1)C′′(1)=n(n−1)(Pn−2Pn−1+Pn−2)(1.10)
由(1.9)式和(1.10)式我们可以发现:
令 n = 2 n=2 n=2,则 C ( u ) = ∑ i = 0 n B i , 2 ( u ) P i \begin{gathered} C(u) =\sum_{i=0}^{n}B_{i,2}(u)\mathbf{P}_{i}\end{gathered} C(u)=i=0∑nBi,2(u)Pi ,于是
C ( u ) = ( 1 − u ) 2 P 0 + 2 u ( 1 u ) P 1 + u 2 P 2 = ( 1 − u ) ( ( 1 − u ) P 0 + u P 1 ⏟ ) + u ( ( 1 − u ) P 1 + u P 2 ⏟ ) \begin{aligned} \mathop{\mathrm{\mathbf{C}}}(u)& =(1-u)^{2}\mathbf{P}_{0}+2u(1 u)\mathbf{P}_{1}+u^{2}\mathbf{P}_{2} \\&=(1-u)(\underbrace{(1-u)\mathbf{P}_{0}+u\mathbf{P}_{1}})+u(\underbrace{(1-u)\mathbf{P}_{1}+u\mathbf{P}_{2}}) \end{aligned} C(u)=(1−u)2P0+2u(1u)P1+u2P2=(1−u)( (1−u)P0+uP1)+u( (1−u)P1+uP2)
即 C ( u ) C(u) C(u)可以通过对两条一次Bezier曲线的线性插值得到;特别地, C ( u ) C(u) C(u)上的点可通过三次线性插值得到。固定 u = u 0 u=u_0 u=u0,并且令 P 1 , 0 = ( 1 − u 0 ) P 0 + u 0 P 1 \textbf{P}_{1,0}=(1-u_0)\textbf{P}_0+u_0\textbf{P}_1 P1,0=(1−u0)P0+u0P1, P 1 , 1 = ( 1 − u 0 ) P 1 + u 0 P 2 \textbf{P}_{1,1}=(1-u_0)\textbf{P}_1+u_0\textbf{P}_2 P1,1=(1−u0)P1+u0P2, P 2 , 0 = ( 1 − u 0 ) P 1 , 0 + u 0 P 1 , 1 \mathbf{P}_{2,0}=(1-u_{0})\mathbf{P}_{1,0}+u_{0}\mathbf{P}_{1,1} P2,0=(1−u0)P1,0+u0P1,1,则有 C ( u 0 ) = P 2 , 0 C(u_{0}) = P_{2,0} C(u0)=P2,0。
用 C n ( P 0 , ⋯ , P n ) \mathbf{C}_n(\mathbf{P}_0,\cdots,\mathbf{P}_n) Cn(P0,⋯,Pn)表示由控制点 P 0 , ⋯ , P n \mathbf{P}_0,\cdots,\mathbf{P}_n P0,⋯,Pn定义的 n n n次Bezier曲线,有
C n ( P 0 , ⋯ , P n ) = ( 1 − u ) C n − 1 ( P 0 , ⋯ , P n − 1 ) + u C n − 1 ( P 1 , ⋯ , P n ) ( 1.11 ) \mathbf{C}_n(\mathbf{P}_0,\cdots,\mathbf{P}_n)=(1-u)\mathbf{C}_{n-1}(\mathbf{P}_0,\cdots,\mathbf{P}_{n-1})+u\mathbf{C}_{n-1}(\mathbf{P}_1,\cdots,\mathbf{P}_n)\quad(1.11) Cn(P0,⋯,Pn)=(1−u)Cn−1(P0,⋯,Pn−1)+uCn−1(P1,⋯,Pn)(1.11)
这可由基函数的递推定义得到。固定 u = u 0 u=u_0 u=u0,并且记 P 0 , i = P i P_{0,i}=P_i P0,i=Pi,由(1.11)式可以得到计算 n n n次Bezier曲线上的点 C ( u 0 ) = P n , 0 ( u 0 ) C(u_0)=P_{n,0}(u_0) C(u0)=Pn,0(u0)的一个递推算法,即
P k , i ( u 0 ) = ( 1 − u 0 ) P k − 1 , i ( u 0 ) + u 0 P k − 1 , i + 1 ( u 0 ) , i = 0 , 1 , ⋯ , n − k ; k = 1 , 2 , ⋯ , n ( 1.12 ) \mathbf{P}_{k,i}(u_0)=(1-u_0)\mathbf{P}_{k-1,i}(u_0)+u_0\mathbf{P}_{k-1,i+1}(u_0),\quad i=0,1,\cdots,n-k;k=1,2,\cdots,n \quad(1.12) Pk,i(u0)=(1−u0)Pk−1,i(u0)+u0Pk−1,i+1(u0),i=0,1,⋯,n−k;k=1,2,⋯,n(1.12),(1.12)式称为deCastcljau算法,它是一个割角的过程,这个过程所得到的点形成一个三角形。
最后,我们对Bezier方法和幂方法做一个比较。显然,在两者中,Bezier形式几何意义更强。由于(1.10)式以及凸包性和变差减少性,Bezier曲线更适合于曲线的交互设计。设计者通过(Bezier曲线的)控制点可以比通过幂基形式中的系数更直观地控制曲线的形状。而且,和Horner算法相比,deCasteljau算法对舍入误差不敏感。这在直观上是很清楚的,因为可以认为deCasteljau算法只是反复地在两点之间作线性插值运算,所有这些点都位于曲线的附近。Bezier曲线的唯一的缺点是点的计算效率稍差。