曲线曲面基础:2.幂基函数

文章讨论了在开发几何造型系统时如何选择合适的坐标函数,强调了多项式和Bezier表示的优势。虽然多项式函数易于处理和存储,但无法精确表示所有曲线,常常需要作为近似。Bezier表示在计算机处理中更为适用。文中还介绍了幂基曲线的表示和计算方法,包括Horner方法,并探讨了二次和三次曲线的特性,如拐点、尖点和环状结构。
摘要由CSDN通过智能技术生成

显示,如果允许坐标函数 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=0nαiui,0u1(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)=[a0a1an] 1uun =[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+an1)u0+an2)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(0u01) 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(速率为零)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值