B样条是无理的,组成无理B样条曲线或曲面。有理曲线或曲面可以精确地表示圆锥截面。非均匀有理B样条(Non-Uniform Rational B-Splines, NURBS)就是为了表达更精确的曲面引入的,其控制顶点包含权重。NURBS的基函数与B样条不同,但结点向量、张量积的性质和细分规则是不变的。
1 几何角度
在 R d \mathbb{R}^d Rd空间的NURBS实体通过在 R d + 1 \mathbb{R}^{d+1} Rd+1空间的B样条实体投影得到,其中 d d d是维数。图1说明了一个在 R 2 \mathbb{R}^2 R2空间的半圆 C ( ξ ) C(\xi) C(ξ)是如何通过在 R 3 \mathbb{R}^3 R3空间的二次B样条曲线 C w ( ξ ) C^w(\xi) Cw(ξ)得到的。
控制顶点 P i \mathbf{P}_i Pi的表示如下
( P i ) j = ( P i w ) j w i j = 1 , … , d (1) (\mathbf{P}_i)_j=\frac{(\mathbf{P}_i^w)_j}{w_i} \quad j=1,\dots,d \tag{1} (Pi)j=wi(Piw)jj=1,…,d(1)
其中 w i = ( P i w ) d + 1 w_i=(\mathbf{P}_i^w)_{d+1} wi=(Piw)d+1而 P i w \mathbf{P}_i^w Piw是“投影控制顶点”。权重 w i w_i wi在几何上是“投影控制顶点”的“高”,见图1。也就是说 R d \mathbb{R}^{d} Rd维的NURBS实体中的控制顶点,是维的B样条控制顶点前几维分量除以最后一维分量得到的。
从几何上来讲,在NURBS中进行结点插入首先要将NURBS中的控制顶点投影到 R d + 1 \mathbb{R}^{d+1} Rd+1维空间,之后使用B样条结点插入公式计算插入后的控制顶点,最后再将其投影到 R d \mathbb{R}^d Rd维空间得到新的NURBS控制顶点。
2 代数角度
NURBS曲线的基函数表示为
R i p ( ξ ) = N i , p ( ξ ) w i W ( ξ ) = N i , p ( ξ ) w i ∑ i ^ = 1 n N i ^ , p ( ξ ) w i (2) R_{i}^{p}(\xi)=\frac{N_{i, p}(\xi) w_{i}}{W(\xi)}=\frac{N_{i, p}(\xi) w_{i}}{\sum_{\hat{i}=1}^{n} N_{\hat{i}, p}(\xi) w_{i}} \tag{2} Rip(ξ)=W(ξ)Ni,p(ξ)wi=∑i^=1nNi^,p(ξ)wiNi,p(ξ)wi(2)
其中, W ( ξ ) = ∑ i ^ = 1 n N i ^ , p ( ξ ) w i ^ W(\xi)=\sum_{\hat{i}=1}^{n} N_{\hat{i}, p}(\xi) w_{\hat{i}} W(ξ)=∑i^=1nNi^,p(ξ)wi^是权重函数, N i , p ( ξ ) w i N_{i, p}(\xi) w_{i} Ni,p(ξ)wi是B样条基函数。
定义权重的对角矩阵
W = [ w 1 w 2 ⋱ w n ] (3) \mathbf{W}=\left[\begin{array}{llll} w_{1} & & & \\ & w_{2} & & \\ & & \ddots & \\ & & & w_{n} \end{array}\right] \tag{3} W=⎣⎢⎢⎡w1w2⋱wn⎦⎥⎥⎤(3)
记 N ( ξ ) \mathbf{N}(\xi) N(ξ)是表示B样条基函数的列向量,则式(2)可以写成矩阵形式
R ( ξ ) = 1 W ( ξ ) W N ( ξ ) (4) \mathbf{R}(\xi)=\frac{1}{W(\xi)}\mathbf{W}\mathbf{N}(\xi) \tag{4} R(ξ)=W(ξ)1WN(ξ)(4)
NURBS曲面的基函数可以表示为
R i , j p , q ( ξ , η ) = N i , p ( ξ ) M i , p ( ξ ) w i , j ∑ i ^ = 1 n ∑ j ^ = 1 m N i ^ , p ( ξ ) M j ^ , q ( ξ ) w i = 1 W ( ξ , η ) W N ( ξ , η ) (5) R_{i,j}^{p,q}(\xi,\eta)=\frac{N_{i, p}(\xi)M_{i, p}(\xi) w_{i,j}}{\sum_{\hat{i}=1}^{n} \sum_{\hat{j}=1}^{m} N_{\hat{i}, p}(\xi) M_{\hat{j}, q}(\xi) w_{i}}=\frac{1}{W(\xi,\eta)} \mathbf{W}\mathbf{N}(\xi,\eta) \tag{5} Ri,jp,q(ξ,η)=∑i^=1n∑j^=1mNi^,p(ξ)Mj^,q(ξ)wiNi,p(ξ)Mi,p(ξ)wi,j=W(ξ,η)1WN(ξ,η)(5)
NURBS基函数与B样条基函数有相同的性质。
NURBS基函数的一阶导数
d d ξ R i p ( ξ ) = w i W ( ξ ) N i , p ′ ( ξ ) − W ′ ( ξ ) N i , p ( ξ ) W 2 ( ξ ) (6) \frac{d}{d \xi} R_{i}^{p}(\xi)=w_{i} \frac{W(\xi) N_{i, p}^{\prime}(\xi)-W^{\prime}(\xi) N_{i, p}(\xi)}{W^{2}(\xi)} \tag{6} dξdRip(ξ)=wiW2(ξ)W(ξ)Ni,p′(ξ)−W′(ξ)Ni,p(ξ)(6)
其中 N i , p ′ ( ξ ) = d d ξ N i , p ( ξ ) N_{i, p}^{\prime}(\xi)=\frac{d}{d\xi}N_{i,p}(\xi) Ni,p′(ξ)=dξdNi,p(ξ), W ′ ( ξ ) = ∑ i ^ = 1 n N i ^ , p ′ ( ξ ) w i ^ W^{\prime}(\xi)=\sum_{\hat{i}=1}^{n} N_{\hat{i}, p}^ {\prime}(\xi) w_{\hat{i}} W′(ξ)=∑i^=1nNi^,p′(ξ)wi^
在NURBS基函数确定之后,NURBS曲面便可以使用与B样条曲面类似的形式表示
C ( ξ ) = ∑ i = 1 n R i p ( ξ ) P i (7) \mathbf{C(\xi)}=\sum^n_{i=1} R_i^p(\xi) \mathbf{P}_i \tag{7} C(ξ)=i=1∑nRip(ξ)Pi(7)
NURBS曲面
S ( ξ , η ) = ∑ i = 1 n ∑ j = 1 m R i , j p , q ( ξ , η ) P i , j (8) \mathbf{S(\xi,\eta)}=\sum^n_{i=1} \sum^m_{j=1} R_{i,j}^{p,q}(\xi,\eta) \mathbf{P}_{i,j} \tag{8} S(ξ,η)=i=1∑nj=1∑mRi,jp,q(ξ,η)Pi,j(8)
3 一些例子
这里,我们将画一个半圆。我们使用二次NURBS基函数,控制顶点和权重如下
P = [ x 1 y 1 x 2 y 2 x 3 y 3 x 4 y 4 ] = [ − 1 0 − 1 1 1 1 1 0 ] a n d w = [ w 1 w 2 w 3 w 4 ] = [ 1 1 / 2 1 / 2 1 ] (9) \mathbf{P}=\left[\begin{array}{ll} x_{1} & y_1 \\ x_{2} & y_2 \\ x_{3} & y_3 \\ x_{4} & y_4 \end{array}\right]= \left[\begin{array}{ll} -1 & 0 \\ -1 & 1 \\ 1 & 1 \\ 1 & 0 \end{array}\right] \quad\quad\quad\quad and \quad\quad\quad\quad \mathbf{w}=\left[\begin{array}{ll} w_{1} \\ w_{2} \\ w_{3} \\ w_{4} \end{array}\right]= \left[\begin{array}{ll} 1 \\ 1/2 \\ 1/2 \\ 1 \end{array}\right] \tag{9} P=⎣⎢⎢⎡x1x2x3x4y1y2y3y4⎦⎥⎥⎤=⎣⎢⎢⎡−1−1110110⎦⎥⎥⎤andw=⎣⎢⎢⎡w1w2w3w4⎦⎥⎥⎤=⎣⎢⎢⎡11/21/21⎦⎥⎥⎤(9)
假设NURBS基函数和曲线在点 ξ = 3 / 2 \xi=3/2 ξ=3/2求值,则根据B样条基函数的表达式可以算出
再根据式(2)计算出权函数在 ξ = 3 / 2 \xi=3/2 ξ=3/2时的值为
W ( ξ = 3 2 ) = ∑ i = 1 4 N i , 2 ( ξ = 3 2 ) w i = 0 ⋅ 1 + 1 8 ⋅ 1 2 + 5 8 ⋅ 1 2 + 1 4 ⋅ 1 = 5 8 (10) W(\xi=\frac{3}{2})=\sum_{i=1}^4N_{i,2}(\xi=\frac{3}{2})w_i=0\cdot1+\frac{1}{8}\cdot\frac{1}{2}+\frac{5}{8}\cdot\frac{1}{2}+\frac{1}{4}\cdot1=\frac{5}{8} \tag{10} W(ξ=23)=i=1∑4Ni,2(ξ=23)wi=0⋅1+81⋅21+85⋅21+41⋅1=85(10)
于是,可以得到NURBS基函数在 ξ = 3 / 2 \xi=3/2 ξ=3/2处的值
当计算足够多个 ξ \xi ξ的值时,就可以画出NURBS基函数的图像,如图2所示
可以看出,权重 w 2 , w 3 w_2,w_3 w2,w3不仅仅影响基函数 R 2 2 , R 3 2 R_2^2,R_3^2 R22,R32也影响 R 1 2 , R 4 2 R_1^2,R_4^2 R12,R42
之后我们就可以使用给定的节点向量计算NURBS曲线上的点
作为比较,B样条曲线在同样的参数域的坐标计算结果如下
当计算足够多 ξ \xi ξ的值之后,就可以画出NURBS曲线和B样条曲线的图像。由于B样条曲线不包含权重(所有权重为1),所以控制点(−1,1)和(1,1)的比例会变得很大,使圆弧呈方形。
注意,这里使用4个控制顶点构造的半圆在顶点 ( 0 , 1 ) (0,1) (0,1)处有 C 1 C^1 C1连续性。使用结点向量 Ξ = { 0 , 0 , 0 , 1 , 1 , 2 , 2 , 2 } \Xi=\{0,0,0,1,1,2,2,2\} Ξ={0,0,0,1,1,2,2,2},5个基函数和控制顶点,构造的半圆拥有 C 0 C^0 C0连续性。在图1中的半圆就是使用上述的节点向量构造的,其 C 0 C^0 C0连续性可以在与其对应的B样条中看出。