曲线曲面基础:4.有理Bezier曲线

有理曲线和齐次坐标的概念,有理Bezier曲线是有理B样条曲线的特殊情况。
尽管多项式具有很多优点,但是有很多重要的曲线、曲面类型,如圆、椭圆、双曲线、圆柱面、圆锥面、球面等,无法精确地用多项式表达。例如, x y xy xy平面上圆心在原点的单位圆周无法用多项式坐标函数精确地表示。由经典数学可知,包括圆在内的所有二次曲线,都可以用有理函数(即两个多项式相除)来表示,事实上,他们可以用如下形式的有理函数来表示。

x ( u ) = X ( u ) W ( u ) , y ( u ) = Y ( u ) W ( u ) ( 1.13 ) x(u)=\frac{X(u)}{W(u)},\quad y(u)=\frac{Y(u)}{W(u)}\quad(1.13) x(u)=W(u)X(u),y(u)=W(u)Y(u)(1.13)

其中, X ( u ) X(u) X(u) Y ( u ) Y(u) Y(u) W ( u ) W(u) W(u)为多项式,由(1.13)式可见,每个坐标函数都具有相同的分母。

圆心在原点、半径为1的圆可以表示为
x ( u ) = 1 − u 2 1 + u 2 , y ( u ) = 2 u 1 + u 2 x(u)=\frac{1-u^2}{1+u^2},\quad y(u)=\frac{2u}{1+u^2} x(u)=1+u21u2,y(u)=1+u22u

中心在原点,长轴为 y y y周、短轴为 x x x轴,长、短半径分别为2和1的椭圆为
x ( u ) = 1 − u 2 1 + u 2 , y ( u ) = 4 u 1 + u 2 x(u)=\frac{1-u^{2}}{1+u^{2}},\quad y(u)=\frac{4u}{1+u^{2}} x(u)=1+u21u2,y(u)=1+u24u

中心在 P = ( 0 , 4 / 3 ) P=(0, 4/3) P=(0,4/3),横截轴(transverse axis)为 y y y轴的双曲线可表示为
x ( u ) = − 1 + 2 u 1 + 2 u − 2 u 2 , y ( u ) = 4 u ( 1 − u ) 1 + 2 u − 2 u 2 x(u)=\frac{-1+2u}{1+2u-2u^2},\quad y(u)=\frac{4u(1-u)}{1+2u-2u^2}\quad x(u)=1+2u2u21+2u,y(u)=1+2u2u24u(1u)
其中,下面的那个分支(顶点为 P = ( 0 , 2 / 3 ) P=(0,2/3) P=(0,2/3))对应于 u ∈ ( 1 − 3 2 , 1 + 3 2 ) u\in\left(\frac{1-\sqrt{3}}{2},\frac{1+\sqrt{3}}{2}\right) u(213 ,21+3 )

顶点在原点,对称轴为y轴的抛物线可表示为
x ( u ) = u y ( u ) = u 2 x(u)=u\quad y(u)=u^2 x(u)=uy(u)=u2

n n n次有理Bezier曲线的定义为
C ( u ) = ∑ i = 0 n B i , n ( u ) w i P i ∑ i = 0 n B i , n ( u ) w i , 0 ⩽ u ⩽ 1 ( 1.14 ) \mathbf{C}(u)=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i\mathbf{P_i}}{\sum\limits_{i=0}^n B_{i,n}(u)w_i},\quad0\leqslant u\leqslant1 \quad (1.14) C(u)=i=0nBi,n(u)wii=0nBi,n(u)wiPi,0u1(1.14)

其中, P i = ( x i , y i , z i ) P_i=(x_i,y_i,z_i) Pi=(xi,yi,zi) B i , n ( u ) B_{i,n}(u) Bi,n(u)同前, w i w_i wi是标量,称为权因子(weight),于是分母 W ( u ) = ∑ i = 0 n B i , n ( u ) w i W(u)=\sum\limits_{i=0}^n B_{i,n}\left(u\right)w_i W(u)=i=0nBi,n(u)wi是普通的标量函数,除特别声明外,我们假设对所有的 i i i均有 w i > 0 w_i>0 wi>0。在此假设下,对所有的 u ∈ [ 0 , 1 ] u\in\begin{bmatrix}0,1\end{bmatrix} u[0,1] W ( u ) > 0 W(u)>0 W(u)>0。(1.14)式也可以写成
C ( u ) = ∑ i = 0 n R i , n ( u ) P i , 0 ⩽ u ⩽ 1 ( 1 , 15 ) \mathbf{C}(u)=\sum\limits_{i=0}^{n}R_{i,n}(u)\mathbf{P}_{i},\quad0\leqslant u\leqslant1\quad(1,15) C(u)=i=0nRi,n(u)Pi,0u1(1,15)
其中
R i , n ( u ) = w i B i , n ( u ) ∑ j = 0 n w j B j , n ( u ) {R}_{i,n}(u)=\frac{w_iB_{i,n}(u)}{\sum\limits_{j=0}^n w_jB_{j,n}(u)} Ri,n(u)=j=0nwjBj,n(u)wiBi,n(u) R i , n ( u ) R_{i,n}(u) Ri,n(u)是这种形式的曲线的有理基函数。

由(1.15)式和 B i , n ( u ) B_{i,n}(u) Bi,n(u)的性质容易得到 R i , n ( u ) R_{i,n}(u) Ri,n(u)具有如下性质:

  • 非负性: R i , n ( u ) ⩾ 0 R_{i,n}(u)\geqslant0 Ri,n(u)0,对所有的 i i i n n n 0 ⩽ u ⩽ 1 0\leqslant u \leqslant1 0u1
  • 规范性: ∑ i = 0 n R i , n ( u ) = 1 \sum\limits_{i=0}^{n}R_{i,n}(u) = 1 i=0nRi,n(u)=1,对所有的 0 ⩽ u ⩽ 1 0\leqslant u \leqslant1 0u1
  • 端点性质: R 0 , n ( 0 ) = R n , n ( 1 ) = 1 R_{0,n}(0)=R_{n,n}(1)=1 R0,n(0)=Rn,n(1)=1
  • 最大值 R i , n ( u ) R_{i,n}(u) Ri,n(u)在区间 [ 0 , 1 ] [0,1] [0,1]内只达到最大值一次。
  • 如果 w i = 1 w_i=1 wi=1对所有的 i i i成立,则 R i , n ( u ) = B i , n ( u ) R_{i,n}(u) = B_{i,n}(u) Ri,n(u)=Bi,n(u),即 B i , n ( u ) B_{i,n}(u) Bi,n(u) R i , n ( u ) R_{i,n}(u) Ri,n(u)的特例。

由有理基函数的上述性质容易推导出有理Bezier曲线具有如下几何性质:

  • 凸包性:曲线包含在定义它的控制点 { P i } \{P_i\} {Pi}的凸包内。
  • 仿射变换不变性:对有理Bezier曲线进行旋转、平移和缩放变换,其表达形式不变,只是控制点发生了改变;新的控制点可以通过对原控制点作变换得到。即:要对有理Bezier曲线进行仿射变换,只需对其控制点作该变换即可。
  • 变差减少性:和多项式Bezier曲线相同。
  • 端点插值性: C ( 0 ) = P 0 C(0)=P_0 C(0)=P0 C ( 1 ) = P n C(1)=P_n C(1)=Pn
  • u = 0 ( u = 1 ) u=0(u=1) u=0(u=1)处的 k k k阶导矢只依赖于开始的(最后的) k + 1 k+1 k+1个控制点和权因子;特别地, C ′ ( 0 ) C^{\prime}(0) C(0) C ′ ( 1 ) C^{\prime}(1) C(1)分别平行于 P 1 − P 0 P_1-P_0 P1P0 P n − P n − 1 P_n-P_{n-1} PnPn1
  • 多项式Bezier曲线是有理Bezier曲线的特例。

坐标函数形如(1.13)式(即:具有相同的分母)的有理曲线具有一种很好的几何解释,因而可以对其进行高效的处理和紧凑的存储。其思想是利用齐次坐标,用 n + 1 n+1 n+1维空间中的多项式曲线来表示 n n n维空间中的一条有理曲线。三维Euclidcan空间中的一个点 P = ( x , y , z ) P=(x,y,z) P=(x,y,z)。采用齐次坐标, P P P可以用四维空间中的点 P w = ( w x , w y , x z , w ) = ( X , Y , Z , W ) ( w ≠ 0 ) P^w=(wx,wy,xz,w)=(X,Y,Z,W) (w\neq0) Pw=(wx,wy,xz,w)=(X,Y,Z,W)(w=0)来表示。 P P P可由 P w P^w Pw的各个坐标分量除以第四个分量 W W W得到,即:由原点出发将 P w P^w Pw映射到超平面 W = 1 W=1 W=1上。这个映射就是(投影)中心在原点的透视投影,我们将其记为 H H H。于是
P = H { P w } = H { ( X , Y , Z , W ) } = { ( X W , Y W , Z W ) , W ≠ 0 direction ( X , Y , Z ) , W = 0 ( 1.15 ) \mathbf{P}=H\lbrace\mathbf{P}^{w}\rbrace=H\lbrace(X,Y,Z,W)\rbrace=\begin{cases}\left(\frac{X}{W},\frac{Y}{W},\frac{Z}{W}\right), W\neq0\\ \text{direction}(X,Y,Z), W=0\end{cases} \quad (1.15) P=H{Pw}=H{(X,Y,Z,W)}={(WX,WY,WZ),W=0direction(X,Y,Z),W=0(1.15)
注意,对于任意 x , y , z , w 1 , w 2 , w 1 ≠ w 2 x,y,z,w_1,w_2,w_1\neq w_2 x,y,z,w1,w2,w1=w2
H { p w 1 } = H { ( w 1 x , w 1 y , w 1 z , w 1 ) } = ( x , y , z ) = H { ( w 2 x , w 2 y , w 2 z , w 2 ) } = H { P u 2 } \begin{aligned}\\H\left\{\mathbf{p}^{w_{1}}\right\} =H\{(w_{1}x,w_{1}y,w_{1}z,w_{1})\}=(x,y,z) \\=H\{(w_{2}x,w_{2}y,w_{2}z,w_{2})\}=H\{\mathbf{P}^{u_{2}}\}\end{aligned} H{pw1}=H{(w1x,w1y,w1z,w1)}=(x,y,z)=H{(w2x,w2y,w2z,w2)}=H{Pu2}
即:一个点的齐次坐标是不唯一的。

假设给定控制点 { P i } \{P_i\} {Pi},权因子 { w i } \{w_i\} {wi},我们构造带权控制点 P i w = ( w i x i , w i y i , w i z i , w i ) P^{w}_{i} =(w_ix_i,w_iy_i,w_iz_i,w_i) Piw=(wixi,wiyi,wizi,wi),然后在四维空间中定义非有理(即多项式)Bezier曲线
C w ( u ) = ∑ i = 0 n B i , n ( u ) P i w ( 1.17 ) \mathbf{C}^w(u)=\sum\limits_{i=0}^n B_{i,n}(u)\mathbf{P}_i^w \quad (1.17) Cw(u)=i=0nBi,n(u)Piw(1.17)
将透视投影变换 H H H应用于 C w ( u ) {C}^w(u) Cw(u),即可得到(1.14)式中对应的有理Bezier曲线。事实上,写出(1.17)式的各个坐标函数,有
x ( u ) = X ( u ) W ( u ) = ∑ i = 0 n B i , n ( u ) w i x i ∑ i = 0 n B i , n ( u ) w i x(u)=\frac{X(u)}{W(u)}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i x_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_i} x(u)=W(u)X(u)=i=0nBi,n(u)wii=0nBi,n(u)wixi

y ( u ) = Y ( u ) W ( u ) = ∑ i = 0 n B i , n ( u ) w i y i ∑ i = 0 n B i , n ( u ) w i y(u)=\frac{Y(u)}{W(u)}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i y_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_i} y(u)=W(u)Y(u)=i=0nBi,n(u)wii=0nBi,n(u)wiyi

z ( u ) = Z ( u ) W ( u ) = ∑ i = 0 n B i , n ( u ) w i z i ∑ i = 0 n B i , n ( u ) w i z(u)=\frac{Z(u)}{W(u)}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i z_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_i} z(u)=W(u)Z(u)=i=0nBi,n(u)wii=0nBi,n(u)wizi

最后,写成矢量形式,有
C ( u ) = ( x ( u ) , y ( u ) , z ( u ) ) = ∑ i = 0 n B i , n ( u ) w i ( x i , y i , z i ) ∑ i = 0 n B i , n ( u ) w i = ∑ i = 0 n B i , n ( u ) w i P i ∑ i = 0 n B i , n ( u ) w i ( 1.18 ) \mathbf{C}(u)=\left(x(u),y(u),z(u)\right) \\=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_i(x_i,y_i,z_i)}{\sum\limits_{i=0}^n B_{i,n}(u)w_i}=\frac{\sum\limits_{i=0}^n B_{i,n}(u)w_iP_i}{\sum\limits_{i=0}^n B_{i,n}(u)w_{i}}\quad(1.18) C(u)=(x(u),y(u),z(u))=i=0nBi,n(u)wii=0nBi,n(u)wi(xi,yi,zi)=i=0nBi,n(u)wii=0nBi,n(u)wiPi(1.18)
算法实现过程中主要采用(1.17)。因此,在四维空间中来处理有理曲线,最后,应用映射 H H H得到三维空间的结果。

取固定的 u 0 u_0 u0,由于 C w ( u 0 ) C^w(u_0) Cw(u0)是多项式Bezier曲线,我们可以用deCasteljau算法来计算 C w ( u 0 ) C^w(u_0) Cw(u0);然后,利用 C ( u 0 ) = H { C u ( u 0 ) } \mathbf{C}(u_{0})=H\{\mathbf{C}^{u}(u_{0})\} C(u0)=H{Cu(u0)}来计算 C ( u 0 ) C(u_0) C(u0)。因此,对 { P i w } \{P_i^w\} {Piw}应用(1.12)式,有
P k , i w = ( 1 − u 0 ) P k − 1 , i w + u 0 P k − 1 , i + 1 w , i = 0 , 1 , ⋯   , n − k ; k = 1 , 2 , ⋯   , n ( 1.19 ) \mathbf{P}_{k,i}^w=(1-u_0)\mathbf{P}_{k-1,i}^w+u_0\mathbf{P}_{k-1,i+1}^w,\quad i=0,1,\cdots,n-k;k=1,2,\cdots,n\quad(1.19) Pk,iw=(1u0)Pk1,iw+u0Pk1,i+1w,i=0,1,,nk;k=1,2,,n(1.19)

再考虑二维圆弧(第一象限的四分之一圆),有 P 0 = ( 1 , 0 ) P_0=(1,0) P0=(1,0) P 1 = ( 1 , 1 ) P_1=(1,1) P1=(1,1) P 2 = ( 0 , 1 ) P_2=(0,1) P2=(0,1) w 0 = 1 w_0=1 w0=1 w 1 = 1 w_1=1 w1=1 w 2 = 2 w_2=2 w2=2。因此,(1.17)式中的三维控制点是 P 0 w = ( 1 , 0 , 1 ) \mathbf{P}_{0}^{w}=(1,0,1) P0w=(1,0,1) P 1 w = ( 1 , 1 , 1 ) \mathbf{P}_{1}^{w}=(1,1,1) P1w=(1,1,1) P 2 w = ( 0 , 2 , 2 ) \mathbf{P}_{2}^{w}=(0,2,2) P2w=(0,2,2)。于是 C w ( u ) = ( 1 − u ) 2 P 0 w + 2 u ( 1 − u ) P 1 w + u 2 P 2 w \mathbf{C}^{w}(u)=(1-u)^{2}\mathbf{P}_{0}^{w}+2u(1-u)\mathbf{P}_{1}^{w}+u^{2}\mathbf{P}_{2}^{w} Cw(u)=(1u)2P0w+2u(1u)P1w+u2P2w是三维空间中非有理的抛物线弧,将其投影到平面 W = 1 W=1 W=1上,即得到圆弧(第一象限的四分之一圆)。
圆弧 C ( 1 / 2 ) = ( 3 / 5 , 4 / 5 ) C(1/2)=(3/5,4/5) C(1/2)=(3/5,4/5)并不是第一象限的四分之一圆弧的中点,即:参数化不是均匀的。由起点到 ( 3 / 5 , 4 / 5 ) (3/5,4/5) (3/5,4/5)的弧长比整个弧长的一半要长。这在直观上是正确的,对圆弧 C ( u ) C(u) C(u)求导,会发现在起点处的速率是终点处的两倍。

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