B样条基函数:1.引言

仅由一段多项式或有理多项式曲线段组成的曲线往往还不能满足实际应用的要求,它们如下缺点:

  • 当需要满足的约束条件很多时,需要使用高次曲线。例如,为了使Bezier曲线通过 n n n个数据点,需要采用 n − 1 n-1 n1次的曲线。但是,高次曲线用计算机处理时效率较低并且数值稳定性差。
  • 为了精确地拟合一些复杂的形状,需要采用高次曲线。
  • 单独一段曲线(曲面)不适合交互形状设计。尽管可以通过修改控制顶点(和权因子)来改变(有理)Bezier曲线(曲面)的形状,但是,这种控制不具有局部性。

以上问题可以通过采用由分段多项式或分段有理多项式表示的曲线(曲面)来解决。假设曲线 C ( u ) C(u) C(u) m ( = 3 ) m(=3) m(=3) n n n次多项式组成,其定义域为 u ∈ [ 0 , 1 ] u\in[0,1] u[0,1]。参数 u 0 = 0 < u 1 < u 2 < u 3 = 1 u_0=0u0=0<u1<u2<u3=1称为断点(breakpoints),它们对应于三段多项式曲线的端点。记第 i i i段多项式曲线为 C i ( u ) , i = 1 , 2 , … , m C_i(u),i=1,2,\dots,m Ci(u),i=1,2,,m。在构造曲线时,相邻曲线段应该满足一定的连续性(每个断点处的连续性可以不同)。令 C i ( j ) C_i^{(j)} Ci(j)表示 C i ( u ) C_i(u) Ci(u) j j j阶导矢,如果 C i ( j ) ( u i ) = C i + 1 ( j ) ( u i ) C_i^{(j)}(u_i)=C_{i+1}^{(j)}(u_i) Ci(j)(ui)=Ci+1(j)(ui)对所有 0 ⩽ j ⩽ k 0\leqslant j \leqslant k 0jk成立,则称曲线 C ( u ) C(u) C(u) u i u_i ui处是 C k C^k Ck连续的。

可以用任何一种多项式曲线的表示形式来表示 C i ( u ) C_i(u) Ci(u)。假设次数为3,每段4个控制点,一共12个控制点, P i j P_i^j Pij表示第 j j j段多项式曲线的第 i i i个控制点。断点集合为 U = { u 0 , u 1 , u 2 , u 3 } U=\{u_0,u_1,u_2,u_3\} U={u0,u1,u2,u3}均保持不变,令12个控制点 P i j P_i^j Pij任意变化,则得到一个由 U U U上的所有分段三次多项式曲线组成的向量空间 V V V V V V的维数是12, V V V中的曲线在 u 1 u_1 u1 u 2 u_2 u2处可能不连续。现在规定 P 3 1 = P 0 2 P_3^1=P_0^2 P31=P02 P 3 2 = P 0 3 P_3^2=P_0^3 P32=P03,则得到定义在 U U U上并且处处至少 C 0 C^0 C0连续的分段三次多项式曲线组成的向量空间 V 0 V_0 V0 V 0 V_0 V0的维数是10,并且 V 0 ⊂ V \mathcal{V}^{0}\subset\mathcal{V} V0V

如果要求曲线是 C 1 C^1 C1连续的,则更为复杂一些。考虑 u = u 1 u=u_1 u=u1的情形。假设 P 3 1 = P 0 2 P^1_3=P^2_0 P31=P02,令 v = u − u 0 u 1 − u 0 v=\frac{u-u_0}{u_1-u_0} v=u1u0uu0 w = u − u 1 u 2 − u 1 w=\frac{u-u_{1}}{u_{2}-u_{1}} w=u2u1uu1分别是在区间 [ u 0 , u 1 ] [u_0,u_1] [u0,u1] [ u 1 , u 2 ] [u_1,u_2] [u1,u2]上的局部参数, 0 ⩽ v , w ⩽ 1 0\leqslant v,w \leqslant1 0v,w1。在 u 1 u_1 u1 C 1 C^1 C1连续意味着
1 u 1 − u 0 C l ( 1 ) ( v = 1 ) = C 1 ( 1 ) ( u 1 ) = C 2 ( 1 ) ( u 1 ) = 1 u 2 − u 1 C 2 ( 1 ) ( w = 0 ) \begin{aligned}\frac{1}{u_{1}-u_{0}}\mathbf{C}_{\mathrm{l}}^{\left(1\right)}\left(v=1\right)=\mathbf{C}_{1}^{\left(1\right)}\left(u_{1}\right)=\mathbf{C}_{2}^{\left(1\right)}\left(u_{1}\right) =\frac{1}{u_2-u_1}\mathbf{C}_{2}^{(1)}\left(w=0\right)\end{aligned} u1u01Cl(1)(v=1)=C1(1)(u1)=C2(1)(u1)=u2u11C2(1)(w=0)

由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 ) \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})\end{aligned} C(0)=n(P1P0)C′′(0)=n(n1)(P02P1+P0)C(1)=n(PnPn1)C′′(1)=n(n1)(Pn2Pn1+Pn2)
可以得到
3 u 1 − u 0 ( P 3 1 − P 2 1 ) = 3 u 2 − u 1 ( P 1 2 − P 0 2 ) \frac{3}{u_1-u_0}(\mathbf{P}_3^1-\mathbf{P}_2^1)=\frac{3}{u_2-u_1}(\mathbf{P}_1^2-\mathbf{P}_0^2) u1u03(P31P21)=u2u13(P12P02)
故有
p 3 1 = ( u 2 − u 1 ) p 2 1 + ( u 1 − u 0 ) p 1 2 u 2 − u 0 ( 2.1 ) \begin{aligned}\mathbf{p}_3^1=\frac{(u_2-u_1)\mathbf{p}_2^1+(u_1-u_0)\mathbf{p}_1^2}{u_2-u_0}\quad(2.1) \end{aligned} p31=u2u0(u2u1)p21+(u1u0)p12(2.1)

(2.1)式说明 P 3 1 P^1_3 P31 P 3 2 P^2_3 P32可分别利用 P 2 1 P^1_2 P21 P 1 2 P^2_1 P12 P 2 2 P^2_2 P22 P 1 3 P^3_1 P13表示。因此,由 U U U上所有 C 1 C^1 C1连续的分段三次多项式曲线组成的向量空间 V 1 V^1 V1维数为8,并且有 V 1 ⊂ V 0 ⊂ V V^1\subset V^0\subset V V1V0V

以上表明,对分段多项式曲线中的各个(多项式)曲线段独立地进行存储和操作并不是处理这类曲线的理想方法。原因如下:

  • 第一,需要存储多余的数据。事实上,在12个系数中,对于 C 1 C^1 C1连续的三次曲线仅需存储其中8个,而对于 C 2 C^2 C2连续的三次曲线仅需存储6个即可。
  • 第二,若采用Bezier形式来表示各个多项式曲线段,则 C ( u ) C(u) C(u)的连续性依赖于控制点的位置。因此,在保持连续性不变的情况下,调整控制点位置的灵活性就减少了。如果需要 C ( u ) C(u) C(u)具有 C 1 C^1 C1连续性,并且 C 1 ( u ) C_1(u) C1(u) C 3 ( u ) C_3(u) C3(u)的形状已经满意,但是希望修改 C 2 ( u ) C_2(u) C2(u)的形状,他就没有办法了。因为为了保持 C 1 ( u ) C_1(u) C1(u) C 3 ( u ) C_3(u) C3(u)的形状不变以及 C 1 C^1 C1连续性, C 2 ( u ) C_2(u) C2(u)的控制点都不能被移动了。
  • 第三,需要通过一些计算(例如(2.1)式)才能确定曲线的连续性。

采用如下的形式来表示分段多项式曲线
C ( u ) = ∑ i = 0 n f i ( u ) P i ( 2.2 ) \begin{aligned}\mathbf{C}(u)=\sum\limits_{i=0}^nf_i(u)\mathbf{P}_i\quad(2.2) \end{aligned} C(u)=i=0nfi(u)Pi(2.2)
其中 P i P_i Pi是控制点(control point); { f i ( u ) , i = 0 , 1 , ⋯   , n } \left\{f_{i}\left(\begin{matrix}{u}\\ \end{matrix}\right),i=0,1,\cdots,n\right\} {fi(u),i=0,1,,n}是分段多项式函数,它们构成了定义在给定的断点序列 U = { u i } , ( i = 0 , 1 , ⋯   , m ) U=\{u_i\},(i=0,1,\cdots,m) U={ui},(i=0,1,,m)上,并具有所要求的次数及(在每个内部断点处)连续性的所有分段多项式函数组成的向量空间的一组基底。注意:上式中曲线的连续性是由基函数的连续性决定的,因此,移动控制点并不改变曲线的连续性。并且, { f i } \{f_i\} {fi}还应该具有通常所需要的那些优良性质,以确保由(2.2)式定义的曲线具有类似于Bezier曲线的良好的几何性质,例如凸包性、变差减少性、几何不变性等。希望基函数具有的另一个重要性质就是局部支撑性,即每个基函数 f i ( u ) f_i(u) fi(u)仅在少数几个子区间上,而非在整个定义域 [ u 0 , u m ] [u_0,u_m] [u0,um]上非零。由于 P i P_i Pi被用 f i ( u ) f_i(u) fi(u)去乘,因此移动控制点 P i P_i Pi只影响 f i ( u ) f_i(u) fi(u)的非零子区间上(即 f i ( u ) f_i(u) fi(u)在该区间上非零)的曲线的形状。

最后,若找到了合适的分段多项式基函数,就可以构造出分段有理多项式曲线
C w ( u ) = ∑ i = 0 n f i ( u ) P i w ( 2.3 ) \mathbf{C}^w(u)=\sum\limits_{i=0}^nf_i(u)\mathbf{P}_i^w\quad(2.3) Cw(u)=i=0nfi(u)Piw(2.3)
以及非有理和有理的张量积曲面
S ( u , v ) = ∑ i = 0 n ∑ j = 0 n f i ( u ) g j ( v ) P i , j , S w ( u , v ) = ∑ i = 0 n ∑ j = 0 n f i ( u ) g j ( v ) P i , j w ( 2.4 ) \mathbf{S}(u,v)=\sum\limits_{i=0}^n\sum\limits_{j=0}^nf_i(u){{g}_j}(v)\mathbf{P}_{i,j},\quad\mathbf{S}^w(u,v)=\sum\limits_{i=0}^n\sum\limits_{j=0}^nf_i(u)g_j(v)\mathbf{P}_{i,j}^w\quad(2.4) S(u,v)=i=0nj=0nfi(u)gj(v)Pi,j,Sw(u,v)=i=0nj=0nfi(u)gj(v)Pi,jw(2.4)

你可能感兴趣的:(B样条基函数,计算机图形)