显示,如果允许坐标函数 x ( u ) x(u) x(u), y ( u ) y(u) y(u)和 z ( u ) z(u) z(u)是任意的,则可以得到范围很广的曲线。但是,在实际开发一个几何造型系统时,我们需要进行一些折中。理想的情况是将坐标函数限制在满足下述条件的一类函数中:
- 能够精确地表示用户需要的所有曲线。
- 在计算机中能够被方便、高效、精确地处理,特别是:
—可以高效地计算曲线上的点及各阶导矢;
—函数的数值计算对浮点舍入误差(round-off error)不敏感;
—函数所需要的存储量较小。 - 比较简单那,在数学上易于理解。
一类被广泛使用的函数是多项式。尽管它们满足上述标准中的后两项,但有很多类型的重要曲线曲面不能用多项式精确地表示,在系统中,这些曲线只能用多项式逼近。多项式函数的两种常用表示方法——幂基表示和Bezier表示。尽管两者在数学上是等价的,但是我们将看到Bezier表示更适合于计算机中形状的表示和操作。
一条 n n n次曲线的幂基表示形式是
C ( u ) = ( x ( u ) , y ( u ) , z ( u ) ) = ∑ i = 0 n α i u i , 0 ⩽ u ⩽ 1 ( 1.5 ) \mathbf{C}(u)=(x(u),y(u),z(u))=\sum\limits_{i=0}^n\alpha_i u^i,\quad0\leqslant u\leqslant1\quad(1.5) C(u)=(x(u),y(u),z(u))=i=0∑nαiui,0⩽u⩽1(1.5)
其中 a i = ( x i , y i , z i ) a_{i}=(x_{i},y_{i},z_{i}) ai=(xi,yi,zi)是矢量,因而
x ( u ) = ∑ i = 0 n x i u i , y ( u ) = ∑ i = 0 n y i u i , z ( u ) = ∑ i = 0 n z i u i x(u)=\sum_{i=0}^{n}x_i u^i,\quad y(u)=\sum_{i=0}^{n}y_i u^i,\quad z(u)=\sum_{i=0}^{n}z_i u^i x(u)=∑i=0nxiui,y(u)=∑i=0nyiui,z(u)=∑i=0nziui
(1.5)式携程矩阵的形式为
C ( u ) = [ a 0 a 1 ⋯ a n ] [ 1 u ⋮ u n ] = [ a i ] T [ u i ] ( 1.6 ) \mathbf{C}(u)=\left[\begin{matrix}\mathbf{a}_0&\mathbf{a}_1&\cdots&\mathbf{a}_n\end{matrix}\right]\left[\begin{matrix}1\\ u\\ \vdots\\ u^n\end{matrix}\right]=\left[\begin{matrix}\mathbf{a}_i\end{matrix}\right]^T\left[\begin{matrix}u^i\end{matrix}\right]\quad(1.6) C(u)=[a0a1⋯an] 1u⋮un =[ai]T[ui](1.6)
(我们将行向量写成列向量的转置)。对(1.5)式求导得到
a i = C ( i ) ( u ) ∣ u = 0 i ! \mathbf{a}_i=\frac{\mathbf{C}^{\left(i\right)}\left(\begin{matrix}{u}\end{matrix}\right)\mid_{u=0}}{i!} ai=i!C(i)(u)∣u=0
这里, C ( i ) ( u ) ∣ u = 0 \mathbf{C}^{\left(i\right)}\left(\begin{matrix}{u}\end{matrix}\right)\mid_{u=0} C(i)(u)∣u=0 是 C ( u ) C(u) C(u)在 u = 0 u=0 u=0处的 i i i阶导矢。 n + 1 n+1 n+1个函数 { u i } \{u^i\} {ui}称为基函数(或混合函数), { a i } \{a_{i}\} {ai}是幂基表示形式中的系数矢量。给定 u 0 u_{0} u0,计算幂基曲线上的点 C ( u 0 ) C(u_{0}) C(u0)的最有效算法是Horner方法:
- 次数=1时: C ( u 0 ) = a 1 u 0 + a 0 \mathbf{C}(\begin{matrix}{u_{_0}}\\ \end{matrix})=\mathbf{a}_{_1}u_{_0}+\mathbf{a}_{_0} C(u0)=a1u0+a0
- 次数=2时: C ( u 0 ) = ( a 2 u 0 + a 1 ) u 0 + a 0 \mathbf{C}(u_{0})=(\mathbf{a}_{2}u_{0}+\mathbf{a}_{1})u_{0}+\mathbf{a}_{0} C(u0)=(a2u0+a1)u0+a0
- ⋮ \vdots ⋮
- 次数=n时: C ( u 0 ) = ( ⋯ ( ( a n u 0 + a n − 1 ) u 0 + a n − 2 ) u 0 + ⋯ + a 1 ) u 0 + a 0 \mathbf{C}(u_0)=\left(\cdots\left(\left(\mathbf{a}_n u_0+\mathbf{a}_{n-1}\right)u_0+\mathbf{a}_{n-2}\right)u_0+\cdots+\mathbf{a}_1\right)u_0+\mathbf{a}_0 C(u0)=(⋯((anu0+an−1)u0+an−2)u0+⋯+a1)u0+a0
注意,对于二次曲线,加速度矢量 C ′ ′ ( u ) = 2 a 2 \mathbf{C}''(u)=2\mathbf{a}_2 C′′(u)=2a2是一个常量。我们对两种特殊情况(退化的情形)感兴趣,这两种情况都发生在矢量 a 2 a_2 a2平行于起始点处切矢 a 1 a_1 a1的情形,在这种情形下,切矢量不会转弯,因此,我们得到的是直线段。这时,矢量 a 2 a_2 a2所指向的方向和 a 1 a_1 a1相同或相反。对于某个 u 0 ( 0 ⩽ u 0 ⩽ 1 ) u_{0}(0 \leqslant u_{0} \leqslant 1) u0(0⩽u0⩽1), a 1 + 2 a 2 u 0 = 0 a_{1} + 2a_{2}u_{0} = 0 a1+2a2u0=0(即粒子运动的瞬时速率为零),且直线段的一部分被(粒子)沿相反的方向重新走过一遍。
当 n = 3 n=3 n=3时,三次曲线 C ( u ) = a 0 + a 1 u + a 2 u 2 + a 3 u 3 \mathbf{C}(u)=\mathbf{a}_0+\mathbf{a}_1u+\mathbf{a}_2u^2+\mathbf{a}_3u^3 C(u)=a0+a1u+a2u2+a3u3是一类很普遍的曲线:它可以是真正扭曲二点(twisted)三维曲线,不位于任一平面;它可以有一个拐点(inflectin point);或者一个尖点(cusp);或者一个环(loop自交)。如果 a 0 , a 1 , a 2 , a 3 \mathbf{a}_0,\mathbf{a}_1,\mathbf{a}_2,\mathbf{a}_3 a0,a1,a2,a3不在同一平面内,则得到扭曲的空间曲线。若平面曲线在某一点处是光滑的(该点非尖点),并且曲线在该点处的切线穿过该曲线,则称该点为该平面曲线的拐点。这意味着在该点前后曲线的转弯方向(turning direction)发生了改变。在拐点处,或者 C ′ ′ ( u ) = 0 \mathbf{C}''(u)=\mathbf{0} C′′(u)=0,或者 C ′ ( u ) ∣ ∣ C ′ ′ ( u ) \mathbf{C}'(u)||\mathbf{C}''(u) C′(u)∣∣C′′(u) 。在 u = u 0 u=u_{0} u=u0存在尖点的一个必要(但非充分)条件是: C ′ ( u ) = 0 \mathbf{C}'\left(u\right)=\mathbf{0} C′(u)=0(速率为零)。