有很多办法可以用来定义B样条基函数以及证明它的一些重要性质。例如,可以采用截尾幂函数的差商定义,开花定义,以及由德布尔、考克斯和曼斯菲尔德等人提出的递推公式等来定义。这里采用递推定义方法,因为这种方法在计算机实现中是最有效的。
令 U = { u 0 , u 1 , ⋯ , u m } U=\{u_0,u_1,\cdots,u_m\} U={
u0,u1,⋯,um}是一个单调不减的实数序列,即 u i ⩽ u i + 1 , i = 0 , 1 , ⋯ , m − 1 u_{i}{\leqslant}u_{i+1},i{=}0,1,\cdots,m-1 ui⩽ui+1,i=0,1,⋯,m−1。其中, u i u_i ui称为节点, U U U称为节点矢量,用 N i , p ( u ) N_{i,p}(u) Ni,p(u)表示第 i i i个 p p p次( p + 1 p+1 p+1阶)B样条基函数,其定义为
N i , 0 ( u ) = { 1 , 若 u i ⩽ u < u i + 1 0 , 其他 N i , p ( u ) = u − u i u i + p − u i N i , p − 1 ( u ) + u i + p + 1 − u u i + p + 1 − u i + 1 N i + 1 , p − 1 ( u ) ( 2.5 ) \begin{aligned}& \\&N_{i,0}(u)=\begin{cases}1,&若 u_i\leqslant u<u_{i+1}\\ \\ 0,&其他 \end{cases} \\&& \\&N_{i,p}(u) =\frac{u-u_i}{u_{i+p}-u_i}N_{i,p-1}(u)+\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u) \\\end{aligned} \quad (2.5) Ni,0(u)=⎩
⎨
⎧1,0,若ui⩽u<ui+1其他Ni,p(u)=ui+p−uiu−uiNi,p−1(u)+ui+p+1−ui+1ui+p+1−uNi+1,p−1(u)(2.5)
由此可知:
- (1) N i , 0 ( u ) N_{i,0}(u) Ni,0(u)是一个阶梯函数,它在半开区间 u ∈ [ u i , u i + 1 ) u\in[u_i,u_{i+1}) u∈[ui,ui+1)外都为零;
- (2)当 p > 0 p>0 p>0时, N i , p ( u ) N_{i,p}(u) Ni,p(u)是两个 p − 1 p-1 p−1次基函数的线性组合;
- (3)计算一组基函数时需要事先指定节点矢量 U U U和次数 p p p;
- (4)(2.5)式中可能出现 0 / 0 0/0 0/0,规定 0 / 0 = 0 0/0=0 0/0=0;
- (5) N i , p ( u ) N_{i,p}(u) Ni,p(u)是定义在整个实数轴上的分段多项式函数,但我们一般只对它在区间 [ u 0 , u m ] [u_0,u_m] [u0,um]上的部分感兴趣;
- (6)半开区间 [ u i , u i + 1 ) [u_i,u_{i+1}) [ui,ui+1)称为第 i i i个节点区间(knot span),它的长度可以为零,因为相邻节点可以是相同的;
- (7)计算 p p p次基函数的过程生成一个如下形式的三角形阵列:
N 0 , 0 N 0 , 1 N 1 , 0 N 0 , 2 N 1 , 1 N 0 , 3 N 2 , 0 N 1 , 2 N 2 , 1 N 1 , 3 N 3 , 0 N 2 , 2 ⋮ N 3 , 1 ⋮ N 4 , 0 ⋮ \begin{aligned}&N_{0,0} \\&&N_{0,1} \\&N_{1,0}&&& N_{0,2} \\&&N_{1,1} &&&&N_{0,3} \\&N_{2,0}&&& N_{1,2} \\&&N_{2,1}&&&&N_{1,3} \\&N_{3,0}&&&N_{2,2} &&&\vdots \\&&N_{3,1}&&&\vdots \\&N_{4,0}&&\vdots \\ \end{aligned} N0,0N1,0N2,0N3,0N4,0N0,1N1,1N2,1N3,1