曲线曲面基础:3.Bizier曲线

由于幂基和Bezier形式都以多项式函数作为坐标函数,因此,它们在数学上是等价的,即:以其中一种形式表示的曲线也可以表示为另一张形式。但是,当用于几何造型时,Bezier形式比幂基形式优越。

幂基形式具有如下缺点:

  • 它用于形状设计时不够自然,系数 { a i } \{a_{i}\} {ai}只能传递很少的关于曲线形状的直观的几何印象。而且,设计者通常需要指定曲线两端的端点条件,而不仅仅是起点处的条件。
  • 处理幂基多项式的算法更多地具有代数的风格而非几何的风格(如:Horner)。
  • 在数值计算上,幂基形式不是一种好的形式。例如,当系数的数量级变化比较大时Horner算法易于受舍入误差的影响。
    而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=0nBi,n(u)Pi,0u1(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!(ni)!n!ui(1u)ni(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)=1u 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)=(1u)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)=(1u)2P0+2u(1u)P1+(u)2P2,这是一段由 P 0 P_0 P0 P 2 P_2 P2的抛物线弧。我们注意到:

  • { P 0 , P 1 , P 2 } \{\mathbf{P}_0,\mathbf{P}_1,\mathbf{P}_2\} {P0,P1,P2}形成的多边形,称为控制多边形(control Polygon),很好地逼近了曲线的形状。
  • P 0 = C ( 0 ) , P 2 = C ( 1 ) \mathbf{P}_0=\mathbf{C}(0),\mathbf{P}_2=\mathbf{C}(1) P0=C(0),P2=C(1)
  • 曲线在两个端点处的切方向分别平行于 P 1 − P 0 P_{1} - P_{0} P1P0 P 2 − P 1 P_{2} - P_{1} P2P1
  • 曲线包含在由 { P 0 , P 1 , P 2 } \{\mathbf{P}_0,\mathbf{P}_1,\mathbf{P}_2\} {P0,P1,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)=(1u)3P0+3u(1u)2P1+3u2(1u)P2+u3P3,三次Bezier曲线,我们注意到:

  • 控制多边形逼近于曲线的形状。
    • P 0 = C ( 0 ) , P 3 = C ( 1 ) \mathbf{P}_0=\mathbf{C}(0),\mathbf{P}_3=\mathbf{C}(1) P0=C(0),P3=C(1)
  • 端点处的切方向平行于 P 1 − P 0 P_{1} - P_{0} P1P0 P 3 − P 1 P_{3} - P_{1} P3P1
  • 凸包性:这些曲线包含在定义它们的控制点的凸包内。
  • 变差减少性:任意直线和曲线的交点个数不多于它和曲线的控制多边形的交点个数(对于三维Bezier曲线,需要将上述语句中的直线替换为平面)。这表明Bezier曲线大体沿着它的控制多边形前进,不会比它的控制多边形更拐来拐去。
  • 在起点( u = 0 u=0 u=0)处,曲线的转弯方向(turning direction)和 P 0 P 1 P 2 P_{0}P_{1}P_{2} P0P1P2相同;而在( u = 1 u=1 u=1)处,则和 P 1 P 2 P 3 P_{1}P_{2}P_{3} P1P2P3相同。
  • 由控制多边形上存在环并不能推断曲线上也存在环,也不能推断曲线上不存在环。

除了前面提到的性质,Bezier曲线在通常的变换(平移、旋转、缩放)下具有几何不变性,即:要对Bezier曲线进行上述变换,只需对其各个控制点进行该变换即可实现。

在任何一种曲线曲面的表示方法中,基函数的选择决定了曲线的几何特性。基函数一般具有一下性质:

  • 非负性: B i , n ( u ) ⩾ 0 B_{i,n}(u)\geqslant0 Bi,n(u)0
  • 规范性: ∑ i = 0 n B i , n ( u ) = 1 \sum\limits_{i=0}^n B_{i,n}(u)=1 i=0nBi,n(u)=1
  • 端点性质: B 0 , n ( 0 ) = B n , n ( 1 ) = 1 B_{0,n}(0)=B_{n,n}(1)=1 B0,n(0)=Bn,n(1)=1
  • 最大值 B i , n ( u ) B_{i,n}(u) Bi,n(u)在区间 [ 0 , 1 ] [0,1] [0,1]内只达到最大值一次,即仅当 u = i / n u=i/n u=i/n B i , n ( u ) B_{i,n}(u) Bi,n(u)取得最大值。
  • 对称性:对于任意 n > 0 n>0 n>0,多项式序列 { B i , n ( u ) } \{B_{i,n}(u)\} {Bi,n(u)}是关于 u = 1 / 2 u=1/2 u=1/2对称的。
  • 递推定义: B i , n ( u ) = ( 1 − u ) B i , n − 1 ( u ) + u B i − 1 , n − 1 ( u ) B_{i,n}(u)=\left(1-u\right)B_{i,n-1}\left(u\right)+uB_{i-1,n-1}\left(u\right) Bi,n(u)=(1u)Bi,n1(u)+uBi1,n1(u);这里我们规定当 i < 0 i<0 i<0 i > n i>n i>n时, B i , n ( u ) ≡ 0 B_{i,n}(u)\equiv0 Bi,n(u)0
  • 求导公式: B i , n ′ ( u ) = d B i , n ( u ) d u = n ( B i − 1 , n − 1 ( u ) − B i , n − 1 ( u ) ) B_{i,n}'(u)=\frac{\mathrm{d}B_{i,n}(u)}{\mathrm{d}u}=n(B_{i-1,n-1}(u)-B_{i,n-1}(u)) Bi,n(u)=dudBi,n(u)=n(Bi1,n1(u)Bi,n1(u)),这里规定 B − 1 , n − 1 ( u ) ≡ B n , n − 1 ( u ) ≡ 0 B_{-1,n-1}(u)\equiv B_{n,n-1}(u)\equiv0 B1,n1(u)Bn,n1(u)0

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=0nBi...n(u)Pi=i=0nn(Bi1,n1(u)Bi,n1(u))Pi=ni=0n1Bi,n1(u)(Pi+1Pi)(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(P1P0)C′′(0)=n(n1)(P02P1+P0)C(1)=n(PnPn1)C′′(1)=n(n1)(Pn2Pn1+Pn2)(1.10)
由(1.9)式和(1.10)式我们可以发现:

  • n n n次Bezier曲线的导函数是一条 n − 1 n-1 n1次Bezier曲线。
  • u = 0 u=0 u=0 u = 1 u=1 u=1处的导数公式是对称的(这是由于基函数的对称性)。
  • 在端点处的 k k k阶导矢(以一种几何上很直观的方式)只依赖于该端的 k + 1 k+1 k+1个控制点。

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=0nBi,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)=(1u)2P0+2u(1u)P1+u2P2=(1u)( (1u)P0+uP1)+u( (1u)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=(1u0)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=(1u0)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=(1u0)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)=(1u)Cn1(P0,,Pn1)+uCn1(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)=(1u0)Pk1,i(u0)+u0Pk1,i+1(u0),i=0,1,,nk;k=1,2,,n(1.12),(1.12)式称为deCastcljau算法,它是一个割角的过程,这个过程所得到的点形成一个三角形。

最后,我们对Bezier方法和幂方法做一个比较。显然,在两者中,Bezier形式几何意义更强。由于(1.10)式以及凸包性和变差减少性,Bezier曲线更适合于曲线的交互设计。设计者通过(Bezier曲线的)控制点可以比通过幂基形式中的系数更直观地控制曲线的形状。而且,和Horner算法相比,deCasteljau算法对舍入误差不敏感。这在直观上是很清楚的,因为可以认为deCasteljau算法只是反复地在两点之间作线性插值运算,所有这些点都位于曲线的附近。Bezier曲线的唯一的缺点是点的计算效率稍差。

你可能感兴趣的:(曲线曲面基础,计算机图形)