NURBS: 由来
NURBS(Non-Uniform Rational B-Splines) 是一种用于数学建模和计算机图形学的技术。它是一种灵活的用于描述曲线和曲面的方法,具有广泛的应用,包括计算机辅助设计(CAD)、计算机图形学、虚拟现实等领域。NURBS之所以受到青睐,是因为它们可以以高度灵活的方式控制曲线和曲面的形状,同时保持数学上的精确性。
NURBS通过基函数的组合来定义曲线和曲面,这些基函数是基于B样条(B-Splines)基函数的改进,但与B样条不同的是,NURBS允许在基函数中引入 权重 ,从而更灵活地控制曲线和曲面的形状。具体来说,NURBS曲线和曲面可以由控制点 、权重 以及次数 为基础的基函数来定义。这种灵活性使得NURBS能够更好地适应不同形状和设计需求。
B-样条曲线是多项式曲线 。虽然它们灵活且在曲线设计中具有许多良好的特性,但它们不能表示最简单的曲线:圆 。圆只能用有理函数 表示(即,两个多项式的商)。为了处理圆、椭圆和许多其他不能用多项式表示的曲线,因此需要对B样条曲线进行扩展。
圆是一个二次曲线。为什么B样条曲线不能表示它?
以下是四个闭合的B样条曲线,具有8个控制点。从左到右的度数分别是2、3、5和10。二次闭合的B样条看起来不像一个圆,它看起来像一个圆角正方形。三次曲线看起来稍微好一些。随着度数的增加,曲线的"圆润程度"变得更好。十次闭合曲线与圆非常相似;但它依旧不是一个圆。即使你可以把这个十次曲线作为一个圆接受,这也是近似的。
为了解决这个问题,我们将使用 “齐次坐标” 将B样条推广为 有理曲线 。因此,我们有了N on-U niform R ational B -S plines,即NURBS曲线 。
NURBS曲线的定义
我们将齐次坐标 引入到B样条曲线中并推导NURBS 曲线的定义:
给定 n + 1 n+1 n + 1 个控制点 P 0 , P 1 , . . . , P n P_0, P_1, ..., P_n P 0 , P 1 , . . . , P n 和 m + 1 m+1 m + 1 个节点的结点向量 :U = u 0 , u 1 , . . . , u m U = { u_0, u_1, ..., u_m } U = u 0 , u 1 , . . . , u m
由这些参数定义的次数为 p p p 的B样条曲线定义如下:
C ( u ) = ∑ i = 0 n N i , p ( u ) P i \mathbf{C}(u)=\sum_{i=0}^nN_{i,p}(u)\mathbf{P}_i
C ( u ) = i = 0 ∑ n N i , p ( u ) P i
其中,N i , p ( u ) N_{i,p}(u) N i , p ( u ) 是B样条基函数。
将控制点 P i \mathbf{P}_i P i 重写为一个具有四个分量的列向量,第四个分量为 1:
P i = [ x i y i z i 1 ] \mathbf{P}_i=\left[\begin{array}{c}x_i\\y_i\\z_i\\1\end{array}\right]
P i = ⎣ ⎢ ⎢ ⎢ ⎡ x i y i z i 1 ⎦ ⎥ ⎥ ⎥ ⎤
我们可以将这个 P i \mathbf{P}_i P i 视为齐次坐标。由于将一个点的坐标(以齐次形式表示)与非零数相乘不会改变其位置,因此,我们将 P i \mathbf{P}_i P i 的坐标乘以一个权重 w i w_i w i ,这样可以获得一个新的齐次坐标形式:
P i w = [ w i x i w i y i w i z i w i ] \mathbf{P}_{i}^{w}=\left[\begin{array}{c}w_{i}x_{i}\\w_{i}y_{i}\\w_{i}z_{i}\\w_{i}\end{array}\right]
P i w = ⎣ ⎢ ⎢ ⎢ ⎡ w i x i w i y i w i z i w i ⎦ ⎥ ⎥ ⎥ ⎤
注意,P i w \mathbf{P}_{i}^{w} P i w 和 P i \mathbf{P}_{i} P i 在齐次坐标中代表同一点。将这种新的齐次形式代入上述B样条曲线的方程中,我们可以得到:
C w ( u ) = ∑ i = 0 n N i , p ( u ) P i w = ∑ i = 0 n N i , p ( u ) [ w i x i w i y i w i z i w i ] = [ ∑ i = 0 n N i , p ( u ) ( w i x i ) ∑ i = 0 n N i , p ( u ) ( w i y i ) ∑ i = 0 n N i , p ( u ) ( w i z i ) ∑ i = 0 n N i , p ( u ) w i ] \mathbf{C}^w(u)=\sum\limits_{i=0}^nN_{i,p}(u)\mathbf{P}_i^w=\sum\limits_{i=0}^nN_{i,p}(u)\left[\begin{array}{c}w_ix_i\\w_iy_i\\w_iz_i\\w_i\end{array}\right]=\left[\begin{array}{c}\sum\limits_{i=0}^nN_{i,p}(u)(w_ix_i)\\\sum\limits_{i=0}^nN_{i,p}(u)(w_iy_i)\\\sum\limits_{i=0}^nN_{i,p}(u)(w_iz_i)\\\sum\limits_{i=0}^nN_{i,p}(u)w_i\end{array}\right]
C w ( u ) = i = 0 ∑ n N i , p ( u ) P i w = i = 0 ∑ n N i , p ( u ) ⎣ ⎢ ⎢ ⎢ ⎡ w i x i w i y i w i z i w i ⎦ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ i = 0 ∑ n N i , p ( u ) ( w i x i ) i = 0 ∑ n N i , p ( u ) ( w i y i ) i = 0 ∑ n N i , p ( u ) ( w i z i ) i = 0 ∑ n N i , p ( u ) w i ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
因此,点 C w ( u ) C^{w}(u) C w ( u ) 是齐次坐标形式下的B样条曲线表示。
现在,通过将 C w ( u ) C_w(u) C w ( u ) 除以第四个坐标来将其转换回笛卡尔坐标:
C ( u ) = [ ∑ i = 0 n N i , p ( u ) ( w i x i ) ∑ i = 0 n N i , p ( u ) w i ∑ i = 0 n N i , p ( u ) ( w i y i ) ∑ i = 0 n N i , p ( u ) w i ∑ i = 0 n N i , p ( u ) ( w i z i ) ∑ i = 0 n N i , p ( u ) w i 1 ] = ∑ i = 0 n N i , p ( u ) w i ∑ j = 0 n N j , p ( u ) w j [ x i y i z i 1 ] \mathbf{C}(u)=\begin{bmatrix}\frac{\sum_{i=0}^nN_{i,p}(u)(w_ix_i)}{\sum_{i=0}^nN_{i,p}(u)w_i}\\\frac{\sum_{i=0}^nN_{i,p}(u)(w_iy_i)}{\sum_{i=0}^nN_{i,p}(u)w_i}\\\frac{\sum_{i=0}^nN_{i,p}(u)(w_iz_i)}{\sum_{i=0}^nN_{i,p}(u)w_i}\\1\end{bmatrix}=\sum_{i=0}^n\frac{N_{i,p}(u)w_i}{\sum_{j=0}^nN_{j,p}(u)w_j}\begin{bmatrix}x_i\\y_i\\z_i\\1\end{bmatrix}
C ( u ) = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ ∑ i = 0 n N i , p ( u ) w i ∑ i = 0 n N i , p ( u ) ( w i x i ) ∑ i = 0 n N i , p ( u ) w i ∑ i = 0 n N i , p ( u ) ( w i y i ) ∑ i = 0 n N i , p ( u ) w i ∑ i = 0 n N i , p ( u ) ( w i z i ) 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤ = i = 0 ∑ n ∑ j = 0 n N j , p ( u ) w j N i , p ( u ) w i ⎣ ⎢ ⎢ ⎢ ⎡ x i y i z i 1 ⎦ ⎥ ⎥ ⎥ ⎤
最后,我们得到以下形式:
C ( u ) = 1 ∑ i = 0 n N i , p ( u ) w i ∑ i = 0 n N i , p ( u ) w i P i \mathbf{C}(u)=\frac{1}{\sum_{i=0}^nN_{i,p}(u)w_i}\sum_{i=0}^nN_{i,p}(u)w_i\mathbf{P}_i
C ( u ) = ∑ i = 0 n N i , p ( u ) w i 1 i = 0 ∑ n N i , p ( u ) w i P i
上式是由控制点P 0 , P 1 , . . . P n \mathbf{P}_{0}, \mathbf{P}_{1}, ...\mathbf{P}_{n} P 0 , P 1 , . . . P n 定义的次数为 p p p 的NURBS曲线,节点向量为: U = u 0 , u 1 , . . . , u m U = {u_0, u_1, ..., u_m } U = u 0 , u 1 , . . . , u m ,权重分别为 w 0 , w 1 , . . . , w n w_0,w_1,...,w_n w 0 , w 1 , . . . , w n
Tips: 由于权重 w i w_i w i 与控制点 P i \mathbf{P}_i P i 相关联,作为其第四个分量,所以权重的数量和控制点的数量必须一致。
一般情况下,权重w i w_i w i 是正的。但当权重为负值时也会有特别的效果。例如,如果一个权重w i w_i w i 变成零,那么P i \mathbf{P}_i P i 的系数也是零,因此,控制点P i \mathbf{P}_i P i 对于曲线上任意一点u u u 的计算没有影响。因此零权重有时候也被称为**“无穷控制点”**。
两个结论
从上述定义式中,我们可以立即得出两个结论:
如果所有的权重都等于1,那么一个NURBS曲线将简化为一个B样条曲线。
这是显而易见的,因为在这种情况下,齐次形式的控制点与传统笛卡尔形式相同,而1 ∑ i = 0 n N i , p ( u ) w i \frac1{\sum_{i=0}^{n}N_{i,p}(u)w_{i}} ∑ i = 0 n N i , p ( u ) w i 1 分母为1。
NURBS曲线是有理曲线
N i , p ( u ) w i N_{i,p}(u)w_{i} N i , p ( u ) w i 的值是一个 p p p 次多项式,控制点p i \mathbf{p}_i p i 是常数,1 ∑ i = 0 n N i , p ( u ) w i \frac1{\sum_{i=0}^{n}N_{i,p}(u)w_{i}} ∑ i = 0 n N i , p ( u ) w i 1 中分母是所有系数的和,也是一个p p p 次多项式。因此,控制点P i \mathbf{P}_i P i 的系数是两个次数为 p p p 的多项式的商,因此NURBS 曲线C ( u ) C(u) C ( u ) 是有理的。
这两个结论表明B样条曲线是NURBS曲线的特殊情况。此外,由于NURBS曲线是有理的,因此圆、椭圆和许多其他用B样条无法表示的曲线现在都可以通过NURBS曲线定义。
几何解释
NURBS曲线是特殊类型的曲线吗?事实证明它们并不是。实际上,它们只是B样条曲线的另一面。
控制点P i W = ( w i x i , w i y i , w i z i , w i ) \mathbf{P}^{W}_{i}=(\begin{array}{ccc}w_{i}x_{i},&w_{i}y_{i},&w_{i}z_{i},&w_{i}\end{array}) P i W = ( w i x i , w i y i , w i z i , w i ) 有四个分量,可以被看作是四维空间中的一个点,因此下面的C ( u ) C(u) C ( u ) 为四维空间中的B样条曲线:
C w ( u ) = ∑ i = 0 n N i , p ( u ) P i w = ∑ i = 0 n N i , p ( u ) [ w i x i w i y i w i z i w i ] = [ ∑ i = 0 n N i , p ( u ) ( w i x i ) ∑ i = 0 n N i , p ( u ) ( w i y i ) ∑ i = 0 n N i , p ( u ) ( w i z i ) ] \mathbf{C}^w(u)=\sum\limits_{i=0}^nN_{i,p}(u)\mathbf{P}_i^w=\sum\limits_{i=0}^nN_{i,p}(u)\left[\begin{array}{c}w_ix_i\\w_iy_i\\w_iz_i\\w_i\end{array}\right]=\left[\begin{array}{c}\sum\limits_{i=0}^nN_{i,p}(u)(w_ix_i)\\\sum\limits_{i=0}^nN_{i,p}(u)(w_iy_i)\\\sum\limits_{i=0}^nN_{i,p}(u)(w_iz_i)\end{array}\right]
C w ( u ) = i = 0 ∑ n N i , p ( u ) P i w = i = 0 ∑ n N i , p ( u ) ⎣ ⎢ ⎢ ⎢ ⎡ w i x i w i y i w i z i w i ⎦ ⎥ ⎥ ⎥ ⎤ = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ i = 0 ∑ n N i , p ( u ) ( w i x i ) i = 0 ∑ n N i , p ( u ) ( w i y i ) i = 0 ∑ n N i , p ( u ) ( w i z i ) ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
齐次坐标的几何解释:通过将前三个坐标分量除以第四个坐标相当于将四维点投影到平面 w = 1 w = 1 w = 1
上述曲线定义中,通过将前三个坐标除以第四个坐标,可以将B样条曲线定义转换为NURBS曲线定义。
所以我们有结论:三维空间中的NURBS曲线仅仅是四维空间中B样条曲线的投影。
给定n + 1 n+1 n + 1 个控制点P 0 , P 1 , … , P n \mathbf{P}_0,\mathbf{P}_1,\ldots,\mathbf{P}_n P 0 , P 1 , … , P n ,每个点有一个非负权重 w i w_i w i (w i > = 0 w_i >= 0 w i > = 0 ),以及一个包含 m + 1 m+1 m + 1 个节点的节点向量 U = u 0 , u 1 , . . . , u m U = { u_0, u_1, ..., u_m } U = u 0 , u 1 , . . . , u m ,p p p 次NURBS曲线的定义如下:
C ( u ) = ∑ i = 0 n R i , p ( u ) P i \mathbf{C}(u)=\sum_{i=0}^nR_{i,p}(u)\mathbf{P}_i
C ( u ) = i = 0 ∑ n R i , p ( u ) P i
R i , p ( u ) R_{i,p}(u) R i , p ( u ) 表示NURBS曲线基函数 ,其定义如下:
R i , p ( u ) = N i , p ( u ) w i ∑ j = 0 n N j , p ( u ) w j R_{i,p}(u)=\frac{N_{i,p}(u)w_i}{\sum_{j=0}^nN_{j,p}(u)w_j}
R i , p ( u ) = ∑ j = 0 n N j , p ( u ) w j N i , p ( u ) w i
NURBS曲线基函数的重要性质
由于NURBS曲线是B样条的泛化,它应该具有B样条的所有性质。
以下是NURBS曲线基函数最重要的性质
R i , p ( u ) R_{i,p}(u) R i , p ( u ) 是关于 u u u 的 p p p 次有理函数
非负性:对于任意 i i i 和 p p p ,R i , p ( u ) R_{i,p}(u) R i , p ( u ) 都是非负的
局部支撑: R i , p ( u ) R_{i,p}(u) R i , p ( u ) 在 [ u i , u i + p + 1 ) [u_i, u_{i+p+1}) [ u i , u i + p + 1 ) 上非零
因为 N i , p ( u ) N_{i,p}(u) N i , p ( u ) 在 [ u i , u i + p + 1 ) [u_i, u_{i+p+1}) [ u i , u i + p + 1 ) 上非零,所以 R i , p ( u ) R_{i,p}(u) R i , p ( u ) 也是非零的。(假设 w i w_i w i 非负)
在节点区间 [ u i , u i + 1 ) [u_i, u_{i+1}) [ u i , u i + 1 ) 上,最多有 p + 1 p+1 p + 1 个 p p p 次基函数是非零的,即:R i − p , p ( u ) R_{i-p,p}(u) R i − p , p ( u ) ,R i − p + 1 , p ( u ) R_{i-p+1,p}(u) R i − p + 1 , p ( u ) ,R i − p + 2 , p ( u ) R_{i-p+2,p}(u) R i − p + 2 , p ( u ) ,… R i , p ( u ) R_{i,p}(u) R i , p ( u ) 。
单位分割:在区间 [ u i , u i + 1 ) [u_i, u_{i+1}) [ u i , u i + 1 ) 上所有非零p p p 次基函数之和为1 :
如果节点数为m + 1 m+1 m + 1 ,基函数的次数为p p p ,且次数为p p p 的基函数数量为n + 1 n+1 n + 1 ,则m = n + p + 1 m=n+p+1 m = n + p + 1 :
基函数 R i , p ( u ) R_{i,p}(u) R i , p ( u ) 是一个次数为 p p p 的有理函数复合曲线,由多个p次有理函数在节点处 [ u i , u i + p + 1 ) [u_i, u_{i+p+1}) [ u i , u i + p + 1 ) 连接组成。
在一个重数为 k k k 的节点处,基函数 R i , p ( u ) R_{i,p}(u) R i , p ( u ) 是 C p − k C^{p-k} C p − k 连续的。
因此,增加多重性会降低曲线在该点连续性,增加次数会增加连续性。
如果对任意i i i ,都有 w i = c w_i = c w i = c ,其中 c c c 是一个非零常数,则R i , p ( u ) = N i , p ( u ) R_{i,p}(u)=N_{i,p}(u) R i , p ( u ) = N i , p ( u ) 。
因此,当所有权重变为非零常数时,B样条基函数是NURBS基函数的特殊情况
我们已经提过,当 c = 1 c = 1 c = 1 时,NURBS曲线的定义会退化成B样条曲线。
NURBS 曲线的重要特性
下面列出了NURBS曲线的重要特性。
与B样条曲线一样,NURBS曲线可以是O p e n Open O p e n 的、C l a m p e d Clamped C l a m p e d 的或C l o s e d Closed C l o s e d 的。如果前p + 1 p+1 p + 1 个节点值为0,后p + 1 p+1 p + 1 个节点值为1,(前提是曲线的定义域为[ 0 , 1 ] [0,1] [ 0 , 1 ] )则曲线是C l a m p e d Clamped C l a m p e d 的。
NURBS曲线 C ( u ) C(u) C ( u ) 是一个分段曲线,其中每个曲线段都是一个次数为 p p p 的有理曲线。
实际上,每个曲线段都是一个有理贝塞尔曲线。
NURBS曲线必须满足 m = n + p + 1 m = n + p + 1 m = n + p + 1
C l a m p e d Clamped C l a m p e d NURBS曲线C ( u ) C(u) C ( u ) 通过端点的两个控制点P 0 P_0 P 0 和P n P_n P n 。
强凸包性质:**NURBS曲线位于其控制点定义的凸包内。**并且,如果u u u 在节点区间[ u i , u i + 1 ) [u_i,u_{i+1}) [ u i , u i + 1 ) 内,则C ( u ) C(u) C ( u ) 位于控制点P i − p , P i − p + 1 , . . . , P i P_{i-p}, P_{i-p+1}, ..., P_i P i − p , P i − p + 1 , . . . , P i 定义的的凸包内。
NURBS基函数的权重必须是非负的 ,如果其中一些是负数,则强凸包性质甚至凸包性质都有可能不满足。
在下面,左图是一个2次NURBS曲线,n = 2 , m = 5 n = 2,m = 5 n = 2 , m = 5 ,前三个节点和后三个节点是Clamped的。两端的两个控制点权重为1,中间的控制点的权重为0.5。此时NURBS曲线是一个椭圆弧,曲线段位于凸壳内。
中间图中的中间控制点的权重被设为零,结果就是NUBRS退化为由端点确定的线段。它仍然位于凸包内。如果将中间控制点权重改为-0.5(右图),则曲线段不包含在凸包中,因此凸包性质失效。
局部修改特性:改变控制点 P i \mathbf{P}_i P i 仅会影响到曲线 C ( u ) C(u) C ( u ) 在区间 [ u i , u i + p + 1 ) [u_i, u_{i+p+1}) [ u i , u i + p + 1 ) 上的部分 。
这是基于B样条基函数的局部修改特性得出的。回想一下,R i , p ( u ) R_{i,p}(u) R i , p ( u ) 在区间 [ u i , u i + p + 1 ) [u_i,u_{i+p+1}) [ u i , u i + p + 1 ) 上是非零的。
如果 u u u 不在这个区间内,由于R i , p ( u ) R_{i,p}(u) R i , p ( u ) 为零且在计算 p ( u ) \mathbf{p}(u) p ( u ) 时, R i , p ( u ) p ( u ) R_{i,p}(u)\mathbf{p}(u) R i , p ( u ) p ( u ) 没有影响。另一方面,如果 u u u 在指定的区间内,R i , p ( u ) R_{i,p}(u) R i , p ( u ) 非零的,此时如果改变 R i , p ( u ) p ( u ) R_{i,p}(u)\mathbf{p}(u) R i , p ( u ) p ( u ) ,那么 C ( u ) C(u) C ( u ) 也会改变。
这种局部修改方案对曲线设计非常重要,因为我们可以在局部修改曲线而不会在全局范围内改变形状。此外,如果需要微调曲线形状,可以插入更多的节点(或者更多的控制点),以便受影响的区域可以被限制在非常窄的范围内。
如果 u u u 是一个重数为 k k k 的节点,那么 C ( u ) C(u) C ( u ) 在该节点处是 C p − k C^{p-k} C p − k 连续的。
如果 u u u 不是一个节点,C ( u ) C(u) C ( u ) 位于一个 p p p 次曲线段的中间,因此是无限可微的。
如果 u u u 是在 R i , p ( u ) R_{i,p}(u) R i , p ( u ) 的非零定义域上的一个节点,由于R i , p ( u ) R_{i,p}(u) R i , p ( u ) 仅是C p − k C^{p-k} C p − k 连续的,所以 C ( u ) C(u) C ( u ) 也是C p − k C^{p-k} C p − k 连续的。
变差缩减特性:
如果曲线包含在一个平面(或空间)中,这意味着没有直线(或平面)比它与曲线的控制折线相交的次数更多。
B样条曲线和贝塞尔曲线是NURBS曲线的特殊情况
如果所有的权重都相等,那么NURBS曲线就变成了B样条曲线。
进一步地,令n = p n = p n = p (即,B样条曲线的阶数等于n n n ,即控制点数量减1),并且有2 ( p + 1 ) = 2 ( n + 1 ) 2(p + 1) = 2(n + 1) 2 ( p + 1 ) = 2 ( n + 1 ) 个节点,其中前p + 1 p + 1 p + 1 个节点和后p + 1 p+1 p + 1 个节点在端部被c l a m p e d clamped c l a m p e d ,那么这个NURBS曲线就退化为一个贝塞尔曲线。
投影变换不变性
如果将投影变换应用于NURBS曲线,则结果可以由其经过投影变换后的控制点构造而成。当我们想要对 NURBS 曲线应用几何变换 甚至投影变换 时,我们可以将变换应用于控制点,而转换后的 NURBS 曲线由转换后的控制点定义。因此,无需直接对曲线进行变换。
注意,贝塞尔曲线和B样条曲线只满足仿射不变性质,而不是这种投影不变性质。这是因为只有NURBS曲线涉及投影变换。
NURBS曲线:修改权重的影响
NURBS曲线的基函数为
R i , p ( u ) = N i , p ( u ) w i ∑ j = 0 n N j , p ( u ) w j R_{i,p}(u)=\frac{N_{i,p}(u)w_i}{\sum_{j=0}^nN_{j,p}(u)w_j}
R i , p ( u ) = ∑ j = 0 n N j , p ( u ) w j N i , p ( u ) w i
因此,增加和减少w i w_i w i 的值将分别增加和减少R i , p ( u ) R_{i,p}(u) R i , p ( u ) 的值。更准确地说,增加w i w_i w i 的值将会拉动曲线朝向控制点p i \mathbf{p}_i p i 。
并且,曲线上所有受影响的点也将朝向p i \mathbf{p}_i p i 的方向被拉动。当w i w_i w i 趋近于无穷时,曲线将通过控制点p i \mathbf{p}_i p i 。另一方面,减少w i w_i w i 的值将使曲线远离控制点p i \mathbf{p}_i p i 。
下图显示了一个6次NURBS曲线及其基函数。所选观察控制点为 p 9 \mathbf{p}_9 p 9 。在第一个图中,所有权重都是1,曲线是B样条曲线。在第二个图中,w 9 w_9 w 9 增加到2,可以看到曲线的一部分向 p 9 \mathbf{p}_9 p 9 移动。由于 w 9 w_9 w 9 增加了,所以R 9 , 6 ( u ) R_{9,6}(u) R 9 , 6 ( u ) 也如右图所示增加了。
下面,我们将w 9 w_9 w 9 进一步增加到5、10和20,相应的也R 9 , 6 ( u ) R_{9,6}(u) R 9 , 6 ( u ) 也变得更大,这也将曲线进一步拉向控制点p 9 \mathbf{p}_9 p 9 。当w 9 w_9 w 9 = 20时,曲线已经非常接近p 9 \mathbf{p}_9 p 9 点了。
再来看看相反的效果。以下是所有权重都为1的初始情况。然后,w 9 w_9 w 9 被减小到0.5,这将曲线推离控制点 p 9 \mathbf{p}_9 p 9 。由于权重减少,相应的 R 9 , 6 ( u ) R_{9,6}(u) R 9 , 6 ( u ) 也会减小,控制点 p 9 \mathbf{p}_9 p 9 对曲线 w 9 w_9 w 9 的影响也会减小。
当 w 9 w_9 w 9 改变为0.1时,曲线被进一步推离。最后一幅图显示了 w 9 w_9 w 9 为零时的曲线。由于 R 9 , 6 ( u ) R_{9,6}(u) R 9 , 6 ( u ) 为零,它对曲线没有影响,因此,与控制点 p 9 \mathbf{p}_9 p 9 相对的曲线段几乎变成平坦的线段。
因此,我们有以下结论:
增加( 或减少 )权重 w i w_i w i 的值会使曲线朝着(或远离)控制点 p i \mathbf{p}_i p i 移动。当 w i w_i w i 的值变为无穷大时,曲线通过控制点 p i \mathbf{p}_i p i ,而当 w i w_i w i 为零时,控制点 p i \mathbf{p}_i p i 对曲线没有影响。
进一步讨论
我们想要更准确地分析改变控制点权重的影响。
NURBS曲线的定义:
C ( u ) = 1 ∑ i = 0 n N i , p ( u ) w i ∑ i = 0 n N i , p ( u ) w i P i \mathbf{C}(u)=\frac{1}{\sum_{i=0}^{n}N_{i,p}(u)w_{i}}\sum_{i=0}^{n}N_{i,p}(u)w_{i}\mathbf{P}_{i}
C ( u ) = ∑ i = 0 n N i , p ( u ) w i 1 i = 0 ∑ n N i , p ( u ) w i P i
我们选择控制点 P k P_k P k ,并观察改变权重 w k w_k w k 对曲线的影响。
由于 P k P_k P k 仅在其系数 N k , p ( u ) N_{k,p}(u) N k , p ( u ) 非零的区域(即,[ u k , u k + p + 1 ) [u_k, u_{k+p+1}) [ u k , u k + p + 1 ) )上对曲线 C ( u ) C(u) C ( u ) 有影响,因此,在接下来的讨论中,我们假设 u u u 在 [ u k , u k + p + 1 ) [u_k, u_{k+p+1}) [ u k , u k + p + 1 ) 内。
将涉及w k w_k w k 的项从曲线定义中分离出来,得到下式:
C ( u ) = 1 N k , p ( u ) w k + ∑ i ≠ k n N i , p ( u ) w i ( N k , p ( u ) w k P k + ∑ i ≠ k n N i , p ( u ) w i P i ) \mathbf{C}(u)=\frac{1}{N_{k,p}(u)w_{k}+\sum_{i\neq k}^{n}N_{i,p}(u)w_{i}}\left(N_{k,p}(u)w_{k}\mathbf{P}_{k}+\sum_{i\neq k}^{n}N_{i,p}(u)w_{i}\mathbf{P}_{i}\right)
C ( u ) = N k , p ( u ) w k + ∑ i = k n N i , p ( u ) w i 1 ⎝ ⎛ N k , p ( u ) w k P k + i = k ∑ n N i , p ( u ) w i P i ⎠ ⎞
我们简化一下这个公式,令:
A = N k , p ( u ) w k B = ∑ i ≠ k N i , p ( u ) w i X = ∑ i ≠ k n N i , p ( u ) w i P i \begin{aligned}&A=N_{k,p}(u)w_{k}\\&B=\sum_{i\neq k}N_{i,p}(u)w_{i}\\&\mathbf{X}=\sum_{i\neq k}^{n}N_{i,p}(u)w_{i}\mathbf{P}_{i}\end{aligned}
A = N k , p ( u ) w k B = i = k ∑ N i , p ( u ) w i X = i = k ∑ n N i , p ( u ) w i P i
上式曲线的定义变成如下:
C ( u ) = 1 A + B ( A P k + X ) \mathbf{C}(u)=\frac{1}{A+B}(A\mathbf{P}_{k}+\mathbf{X})
C ( u ) = A + B 1 ( A P k + X )
考虑首先 w k = 0 w_k = 0 w k = 0 的情况。我们有 A = 0 \mathbf{A} = 0 A = 0 ,曲线上的点,记为 C 0 ( u ) C^0(u) C 0 ( u ) :
C 0 ( u ) = X B \mathbf{C}^0(u)=\frac{\mathbf{X}}{B}
C 0 ( u ) = B X
现在计算从这个基本点 C 0 ( u ) C^0(u) C 0 ( u ) 到任意w k w_k w k 对应的点 C ( 𝑢 ) C(𝑢) C ( u ) 的向量
C ( u ) − C 0 ( u ) = 1 A + B ( A P k + X ) − X B = A A + B ( P k − X B ) = A A + B ( P k − C 0 ( u ) ) \begin{aligned}
\mathbf{C}(u)-\mathbf{C}^{0}(u)& =\frac{1}{A+B}(A\mathbf{P}_{k}+\mathbf{X})-\frac{\mathbf{X}}{B} \\
&={\frac{A}{A+B}}\left(\mathbf{P}_{k}-{\frac{\mathbf{X}}{B}}\right) \\
&=\frac{A}{A+B}\left(\mathbf{P}_{k}-\mathbf{C}^{0}(u)\right)
\end{aligned}
C ( u ) − C 0 ( u ) = A + B 1 ( A P k + X ) − B X = A + B A ( P k − B X ) = A + B A ( P k − C 0 ( u ) )
这意味着向量 C ( u ) − C 0 ( u ) C(u)-C^0(u) C ( u ) − C 0 ( u ) 和向量 C k − C 0 ( u ) C_k-C^0(u) C k − C 0 ( u ) 有相同的方向,前者的长度是后者的 A / ( A + B ) A/(A+B) A / ( A + B ) 倍
对于 [ u k , u k + p + 1 ) [u_k, u_{k+p+1}) [ u k , u k + p + 1 ) 上的每一个 u u u 都是如此。因为点 C k C_k C k 和 C 0 ( u ) C^0(u) C 0 ( u ) 是固定的,我们可以认为 C ( u ) C(u) C ( u ) 位于 P k \mathbf{P}_k P k 和 C 0 ( u ) C^0(u) C 0 ( u ) 的线上
如果所有的权重都是非负的,那么 A A A 和 B B B 都是非负的,且 A / ( A + B ) A/(A+B) A / ( A + B ) 的值在0和1之间。也就是说,点 C ( u ) C(u) C ( u ) 位于 P k \mathbf{P}_k P k 和 C 0 ( u ) C^0(u) C 0 ( u ) 的线段上。
如果 w k w_k w k 趋向无穷大会怎么样?我们将曲线C ( u ) C(u) C ( u ) 的分子和分母除以 w k w_k w k ,得到如下:
C ( u ) = 1 N k , p ( u ) w k + ∑ i ≠ k N i , p ( u ) w i ( N k , p ( u ) w k P k + ∑ i ≠ k n N i , p ( u ) w i P i ) = 1 N k , p ( u ) + 1 w k ∑ i ≠ k N i , p ( u ) w i ( N k , p ( u ) P k + 1 w k ∑ i ≠ k n N i , p ( u ) w i P i ) \mathbf{C}(u)=\frac{1}{N_{k,p}(u)w_{k}+\sum_{i\neq k}N_{i,p}(u)w_{i}}\left(N_{k,p}(u)w_{k}\mathbf{P}_{k}+\sum_{i\neq k}^{n}N_{i,p}(u)w_{i}\mathbf{P}_{i}\right)\\=\frac{1}{N_{k,p}(u)+\frac{1}{w_{k}}\sum_{i\neq k}N_{i,p}(u)w_{i}}\left(N_{k,p}(u)\mathbf{P}_{k}+\frac{1}{w_{k}}\sum_{i\neq k}^{n}N_{i,p}(u)w_{i}\mathbf{P}_{i}\right)
C ( u ) = N k , p ( u ) w k + ∑ i = k N i , p ( u ) w i 1 ⎝ ⎛ N k , p ( u ) w k P k + i = k ∑ n N i , p ( u ) w i P i ⎠ ⎞ = N k , p ( u ) + w k 1 ∑ i = k N i , p ( u ) w i 1 ⎝ ⎛ N k , p ( u ) P k + w k 1 i = k ∑ n N i , p ( u ) w i P i ⎠ ⎞
如果w k w_k w k 趋近于无穷大,那么 1 w k \frac{1}{w_k} w k 1 趋近于零,则 P ( u ) \mathbf{P}(u) P ( u ) 趋近于P k \mathbf{P}_k P k ,即所选控制点。
因此我们有以下结论:
如果 w k w_k w k 是非负的, C ( u ) C(u) C ( u ) 总是位于 C 0 ( u ) C^0(u) C 0 ( u ) 和 P k \mathbf{P}_k P k 的线段上,其中 C 0 ( u ) C^0(u) C 0 ( u ) 是对应于 w k = 0 w_k = 0 w k = 0 的点 , u u u 在 [ u k , u k + p + 1 ) [u_k, u_{k+p}+1) [ u k , u k + p + 1 ) 范围内。
**当 w k w_k w k 从0变化到无穷大时, C ( u ) C(u) C ( u ) 从 C 0 ( u ) C^0(u) C 0 ( u ) 移动到 P k \mathbf{P}_k P k ,如果 w k w_k w k 是无穷大, C ( u ) C(u) C ( u ) 变成 C k C_k C k **
我们有一个由9个控制点(n = 8 n = 8 n = 8 )和16个节点(m = 15 m = 15 m = 1 5 )定义的6次NURBS曲线,如下所示。
所选的控制点是 P 4 \mathbf{P}_4 P 4 。由于 P 4 \mathbf{P}_4 P 4 的系数 N 4 , 6 ( u ) N_{4,6}(u) N 4 , 6 ( u ) 在 [ u 4 , u 4 + 6 + 1 ) = [ 0 , 1 ) [u_4, u_{4+6+1}) = [0,1) [ u 4 , u 4 + 6 + 1 ) = [ 0 , 1 ) 上非零,因此,改变 w 4 w_4 w 4 会影响整条曲线!如下图所示:
对应于 u = 1 / 3 u = 1/3 u = 1 / 3 和 u = 2 / 3 u = 2/3 u = 2 / 3 的点在曲线上以不同的颜色标记。对应于 w 4 = 0 w_4 = 0 w 4 = 0 的曲线是最低的,标记为0。图中显示了 w 4 w_4 w 4 为2、3、4、5、10、20和50的曲线。随着 w 4 w_4 w 4 的值增加,曲线被拉向控制点 P 4 \mathbf{P}_4 P 4 。当 w 4 w_4 w 4 增加到50时,曲线变得非常接近P 4 \mathbf{P}_4 P 4 。
注意,所有对应于 C ( 1 3 ) C(\frac{1}{3}) C ( 3 1 ) 的点都在C 0 ( 1 3 ) C^0(\frac{1}{3}) C 0 ( 3 1 ) 和 的P 4 \mathbf{P}_4 P 4 线段上,所有对应于C ( 2 3 ) C(\frac{2}{3}) C ( 3 2 ) 的点都在 C 0 ( 2 3 ) C^0(\frac{2}{3}) C 0 ( 3 2 ) 和 P 4 \mathbf{P}_4 P 4 的线段上。
随着 w 4 w_4 w 4 的值增加, C ( 1 3 ) C(\frac{1}{3}) C ( 3 1 ) 和 C ( 2 3 ) C(\frac{2}{3}) C ( 3 2 ) 之间的曲线段变短。最终,当 w 4 w_4 w 4 为无穷大时,这个曲线段的长度变为零(即,C ( 1 3 ) C(\frac{1}{3}) C ( 3 1 ) 和C ( 2 3 ) C(\frac{2}{3}) C ( 3 2 ) 变为与 P 4 \mathbf{P}_4 P 4 相同)。
NURBS曲线:节点插入
由于NURBS曲线是四维空间中的B样条曲线投影到三维空间的结果,因此对NURBS曲线进行节点插入是很容易的。
对NURBS曲线进行节点插入分为三个步骤:
(1)将给定三维空间中的NURBS曲线转换为四维空间中的B样条曲线
(2)对这个四维B样条曲线执行节点插入
(3)将新的控制点集投影回三维空间,得到NURBS曲线的新的一组控制点。
假设我们有 n + 1 n + 1 n + 1 个控制点 P 0 , P 1 , . . . , P n \mathbf{P}_0, \mathbf{P}_1, ..., \mathbf{P}_n P 0 , P 1 , . . . , P n ,带有权重 w 0 , w 1 , . . . , w n w_0, w_1, ..., w_n w 0 , w 1 , . . . , w n ,一个节点向量 U U U 和一个次数 p p p 。令 P i = ( x i , y i , z i ) \mathbf{P}_i = (x_i, y_i, z_i) P i = ( x i , y i , z i ) 。
那么,控制点 P i w = ( w i x i , w i y i , w i z i , w i ) \mathbf{P}^w_i = ( w_i x_i, w_i y_i, w_i z_i, w_i ) P i w = ( w i x i , w i y i , w i z i , w i ) ,0 ≤ i ≤ n 0 \leq i \leq n 0 ≤ i ≤ n ,和节点向量 U U U 定义了一个四维的 p p p 次B样条曲线。向这个四维B样条曲线插入一个新节点 t t t ,得到一个新的控制点集合 Q i w = ( X i , Y i , Z i , W i ) Q^w_i = ( X_i, Y_i, Z_i, W_i ) Q i w = ( X i , Y i , Z i , W i ) ,0 ≤ i ≤ n 0 \leq i \leq n 0 ≤ i ≤ n 。然后将它们投影回三维空间,即通过将坐标的前三个分量除以第四个分量,可得到给定 NURBS 曲线的新的控制点集合。
让我们来看一个例子。假设我们有 9 个结点
下面是在x y xy x y 平面上定义的次数为3的NURBS曲线的5个控制点:
下图展示了曲线形状及其基础函数。
我们插入一个新的节点 t = 0.4 t = 0.4 t = 0 . 4 。由于 t t t 在节点区间 [ u 3 , u 4 ) [u_3, u_4) [ u 3 , u 4 ) 中,并且 NURBS 曲线的次数是3,受影响的控制点是 P 3 、 P 2 、 P 1 \mathbf{P}_3、\mathbf{P}_2、\mathbf{P}_1 P 3 、 P 2 、 P 1 和 P 0 \mathbf{P}_0 P 0 。由于这是一条 NURBS 曲线,通过将所有控制点乘以它们对应的权重来计算齐次坐标,这些新的控制点为P i w \mathbf{P}^w_i P i w :
注意,由于 P 4 \mathbf{P}_4 P 4 不受影响,因此未在上表中计算。我们将按以下方式计算 a 3 、 a 2 a_3、a_2 a 3 、 a 2 和 a 1 a_1 a 1 :
a 3 = t − u 3 u 6 − u 3 = 0.4 − 0 1 − 0 = 0.4 a 2 = t − u 2 u 5 − u 2 = 0.4 − 0 1 − 0 = 0.4 a 1 = t − u 1 u 4 − u 1 = 0.4 − 0 0.5 − 0 = 0.8 a_{3}=\frac{t-u_{3}}{u_{6}-u_{3}}=\frac{0.4-0}{1-0}=0.4\\a_{2}=\frac{t-u_{2}}{u_{5}-u_{2}}=\frac{0.4-0}{1-0}=0.4\\a_{1}=\frac{t-u_{1}}{u_{4}-u_{1}}=\frac{0.4-0}{0.5-0}=0.8 a 3 = u 6 − u 3 t − u 3 = 1 − 0 0 . 4 − 0 = 0 . 4 a 2 = u 5 − u 2 t − u 2 = 1 − 0 0 . 4 − 0 = 0 . 4 a 1 = u 4 − u 1 t − u 1 = 0 . 5 − 0 0 . 4 − 0 = 0 . 8
新的控制点Q 3 w , Q 2 w \mathbf{Q}^w_3, \mathbf{Q}^w_2 Q 3 w , Q 2 w 和 Q 1 w \mathbf{Q}^w_1 Q 1 w 为:
Q 3 w = ( 1 − a 3 ) P 2 w + a 3 P 3 w = ( 325.6 , 26 , 4.4 ) Q 2 w = ( 1 − a 2 ) P 1 w + a 2 P 2 w = ( 97.4 , 142.5 , 1.9 ) Q 1 w = ( 1 − a 1 ) P 0 w + a 1 P 1 w = ( − 42 , 14.8 , 0.6 ) \mathbf{Q}_{3}^{w}=(1-a_{3})\mathbf{P}_{2}^{w}+a_{3}\mathbf{P}_{3}^{w}=(325.6,26,4.4)\\\mathbf{Q}_{2}^{w}=(1-a_{2})\mathbf{P}_{1}^{w}+a_{2}\mathbf{P}_{2}^{w}=(97.4,142.5,1.9)\\\mathbf{Q}_{1}^{w}=(1-a_{1})\mathbf{P}_{0}^{w}+a_{1}\mathbf{P}_{1}^{w}=(-42,14.8,0.6)
Q 3 w = ( 1 − a 3 ) P 2 w + a 3 P 3 w = ( 3 2 5 . 6 , 2 6 , 4 . 4 ) Q 2 w = ( 1 − a 2 ) P 1 w + a 2 P 2 w = ( 9 7 . 4 , 1 4 2 . 5 , 1 . 9 ) Q 1 w = ( 1 − a 1 ) P 0 w + a 1 P 1 w = ( − 4 2 , 1 4 . 8 , 0 . 6 )
将这些控制点的前两个分量除以第三个分量投影回二维空间,得到
n e w P 3 = ( 74 , 5.9 ) w i t h w e i g h t 4.4 n e w P 2 = ( 51.3 , 75 ) w i t h w e i g h t 1.9 n e w P 1 = ( − 70 , 24.6 ) w i t h w e i g h t 0.6 \begin{array}{rcll}\mathrm{newP}_3&=&(74,5.9)&\mathrm{with~weight~4.4}\\\mathrm{newP}_2&=&(51.3,75)&\mathrm{with~weight~1.9}\\\mathrm{newP}_1&=&(-70,24.6)&\mathrm{with~weight~0.6}\end{array}
n e w P 3 n e w P 2 n e w P 1 = = = ( 7 4 , 5 . 9 ) ( 5 1 . 3 , 7 5 ) ( − 7 0 , 2 4 . 6 ) w i t h w e i g h t 4 . 4 w i t h w e i g h t 1 . 9 w i t h w e i g h t 0 . 6
下图是生成的NURBS曲线及其基函数:
de Boor(德布尔)算法
一旦我们知道如何插入节点,NURBS曲线的de Boor算法就简单了。
我们只需要将每个控制点乘以它的权重,将NURBS曲线转换为四维空间中的B样条曲线 ,在这个四维B样条曲线上执行de Boor算法,然后通过将控制点的前三个分量除以第四个分量,并将第四个分量作为新的权重,就可以将四维曲线投影回三维空间 。
有理贝塞尔曲线
将一个四维B样条曲线投影到 w = 1 w=1 w = 1 的超平面会得到一个三维NURBS曲线。
那么如果这个B样条曲线是一个贝塞尔曲线呢?结果就是一个有理贝塞尔曲线 !
下面的左图显示了一个4阶有理贝塞尔曲线,右图显示了一个三维4阶贝塞尔曲线(红色)及其在超平面 w = 1 w=1 w = 1 中的投影有理贝塞尔曲线(蓝色)。
由一组n + 1 n+1 n + 1 个控制点P 0 , P 1 , . . . , P n \mathbf{P}_0, \mathbf{P}_1, ..., \mathbf{P}_n P 0 , P 1 , . . . , P n 定义的曲线是什么?每个控制点对应一个非负权重 w i w_i w i (即P i \mathbf{P}_i P i 的权重 w i w_i w i >= 0)。增加控制点权重P i w ( 0 < = i < = n ) \mathbf{P}^w_i (0 <= i <= n) P i w ( 0 < = i < = n ) ,可以使四维B样条曲线退化为一个n n n 次贝塞尔曲线,它的基函数为 B n , 0 ( u ) , B n , 1 ( u ) , . . . , B n , n ( u ) B_{n,0}(u),B_{n,1}(u),...,B_{n,n}(u) B n , 0 ( u ) , B n , 1 ( u ) , . . . , B n , n ( u ) 。将这个贝塞尔曲线投影到平面 w = 1 w = 1 w = 1 ,可以得到:
C ( u ) = ∑ i = 0 n R i , n ( u ) P i \mathbf{C}(u)=\sum_{i=0}^nR_{i,n}(u)\mathbf{P}_i
C ( u ) = i = 0 ∑ n R i , n ( u ) P i
R i , n ( u ) R_{i,n}(u) R i , n ( u ) 的定义如下:
R i , n ( u ) = B n , i ( u ) w i ∑ j = 0 n B n , j ( u ) w j R_{i,n}(u)=\frac{B_{n,i}(u)w_i}{\sum_{j=0}^nB_{n,j}(u)w_j}
R i , n ( u ) = ∑ j = 0 n B n , j ( u ) w j B n , i ( u ) w i
这是NURBS曲线的一个特殊情况,称为有理Bézier 曲线。
由于有理Bézier曲线是NURBS曲线的一个特例 ,因此有理Bézier曲线满足所有NURBS曲线具有的重要性质。
然而,由于没有内部节点,有理Bézier曲线不具备局部修改的特性 ,这意味着修改控制点或其权重将导致整个曲线发生变化。修改控制点的权重将使曲线远离或朝向控制点。
有理贝塞尔曲线:圆锥曲线
由于贝塞尔曲线和B样条曲线是多项式曲线,只能表示抛物线。但NURBS和有理贝塞尔曲线是有理的,它们是否能表示椭圆、圆和双曲线,如果可以的话,应该如何做?
五个条件唯一地确定一个圆锥曲线
由三个不共线的控制点 P 0 = ( U 0 , V 0 ) , P 1 = ( U 1 , V 1 ) a n d P 2 = ( U 2 , V 2 ) \mathbf{P}_0=(U_0,V_0),\mathbf{P}_1=(U_1,V_1)\mathrm{~and~}\mathbf{P}_2=(U_2,V_2) P 0 = ( U 0 , V 0 ) , P 1 = ( U 1 , V 1 ) a n d P 2 = ( U 2 , V 2 ) 定义的二次 Bézier曲线表示的是一个抛物线 。我们希望扩展这个概念,以定义椭圆和双曲线的部分。
假设圆锥曲线通过P 0 \mathbf{P}_0 P 0 和P 2 \mathbf{P}_2 P 2 并且在P 0 \mathbf{P}_0 P 0 和P 2 \mathbf{P}_2 P 2 处分别与P 0 P 1 \mathbf{P}_0\mathbf{P}_1 P 0 P 1 和P 1 P 2 \mathbf{P}_1\mathbf{P}_2 P 1 P 2 相切,那么圆锥曲线可以用如下二次隐式方程表示,其中六个系数是未知数:
p ( x , y ) = a x 2 + 2 b x y + c y 2 + 2 d x + 2 e y + f = 0 p(x,y)=ax^2+2bxy+cy^2+2dx+2ey+f=0
p ( x , y ) = a x 2 + 2 b x y + c y 2 + 2 d x + 2 e y + f = 0
如果f f f 在上述方程中不为零,我们可以将整个方程除以f f f :
a x 2 + 2 b x y + c y 2 + 2 d x + 2 e y + 1 = 0 ax^2+2bxy+cy^2+2dx+2ey+1=0
a x 2 + 2 b x y + c y 2 + 2 d x + 2 e y + 1 = 0
这样我们只有五个未知数!如果f f f 是零,我们已经有五个未知数了。由于这条曲线通过 P 0 \mathbf{P}_0 P 0 点,将P 0 \mathbf{P}_0 P 0 的坐标代入上述方程得到:
a U 0 2 + 2 b U 0 V 0 + c V 0 2 + 2 d U 0 + 2 e V 0 + 1 = 0 aU_0^2+2bU_0V_0+cV_0^2+2dU_0+2eV_0+1=0
a U 0 2 + 2 b U 0 V 0 + c V 0 2 + 2 d U 0 + 2 e V 0 + 1 = 0
方程的梯度计算如下:
∇ p ( x , y ) = ⟨ 2 a x + 2 b y + 2 d , 2 b x + 2 c y + 2 e ⟩ \nabla_{p(x,y)}=\langle2ax+2by+2d,2bx+2cy+2e\rangle
∇ p ( x , y ) = ⟨ 2 a x + 2 b y + 2 d , 2 b x + 2 c y + 2 e ⟩
切线和梯度在点P 0 = ( U 0 , V 0 ) \mathbf{P}_0=(U_0,V_0) P 0 = ( U 0 , V 0 ) 处互相垂直。
由于梯度的斜率为
b U 0 + c V 0 + e a U 0 + b V 0 + d \frac{\mathrm{b}U_0+\mathrm{c}V_0+\mathrm{e}}{\mathrm{a}U_0+\mathrm{b}V_0+\mathrm{d}}
a U 0 + b V 0 + d b U 0 + c V 0 + e
在点P 0 = ( U 0 , V 0 ) \mathbf{P}_0=(U_0,V_0) P 0 = ( U 0 , V 0 ) 处的切线的斜率为:
− a U 0 + b V 0 + d b U 0 + c V 0 + e -\frac{\mathrm{a}U_0+\mathrm{b}V_0+\mathrm{d}}{\mathrm{b}U_0+\mathrm{c}V_0+\mathrm{e}}
− b U 0 + c V 0 + e a U 0 + b V 0 + d
由于P 0 P 1 \mathbf{P}_0\mathbf{P}_1 P 0 P 1 是在P 0 \mathbf{P}_0 P 0 处与圆锥曲线相切,且线段P 0 P 1 \mathbf{P}_0\mathbf{P}_1 P 0 P 1 的斜率为( V 1 − V 0 ) / ( U 1 − U 0 ) (V_1-V_0)/(U_1-U_0) ( V 1 − V 0 ) / ( U 1 − U 0 ) ,这两个斜率值必须相等。因此,以下关系必须成立:
V 1 − V 0 U 1 − U 0 = − a U 0 + b V 0 + d b U 0 + c V 0 + e \frac{V_1-V_0}{U_1-U_0}=-\frac{aU_0+bV_0+d}{bU_0+cV_0+e}
U 1 − U 0 V 1 − V 0 = − b U 0 + c V 0 + e a U 0 + b V 0 + d
由于圆锥曲线也通过 P 2 \mathbf{P}_2 P 2 ,因此我们有:
a U 2 2 + 2 b U 2 V 2 + c V 2 2 + 2 d U 2 + 2 e V 2 + 1 = 0 aU_2^2+2bU_2V_2+cV_2^2+2dU_2+2eV_2+1=0
a U 2 2 + 2 b U 2 V 2 + c V 2 2 + 2 d U 2 + 2 e V 2 + 1 = 0
圆锥曲线在P 2 \mathbf{P}_2 P 2 点处与P 1 P 2 \mathbf{P}_1\mathbf{P}_2 P 1 P 2 相切,因此有:
V 2 − V 1 U 2 − U 1 = − a U 2 + b V 2 + d b U 2 + c V 2 + e \frac{V_{2}-V_{1}}{U_{2}-U_{1}}=-\frac{aU_{2}+bV_{2}+d}{bU_{2}+cV_{2}+e}
U 2 − U 1 V 2 − V 1 = − b U 2 + c V 2 + e a U 2 + b V 2 + d
现在,我们有四个方程。如果我们能找到另一个条件,我们将得到五个带有五个未知数的线性方程。解这个线性方程组将得到所有五个系数,从而唯一确定了圆锥曲线。
一种方式是再将一个点的坐标代入方程,得到一个类似于控制点 P 0 \mathbf{P}_0 P 0 和 P 2 \mathbf{P}_2 P 2 的方程。
但是,这个点在哪里 ?
这个点应该位于三个控制点构成的三角形内部,以保持凸包性质。
这个点的位置也应该是“规则的”,以便我们可以轻松地改变这个点以生成另一个圆锥曲线。
一种方法是允许这个点位于 P 1 \mathbf{P}_1 P 1 和 P 0 P 2 \mathbf{P}_0\mathbf{P}_2 P 0 P 2 中点的连线上。通过这种方式,将第五个点沿着这条连线移动会生成不同的圆锥曲线,如下所示:
连接点在哪里?
很容易看出,如果选择的点从P 0 P 2 \mathbf{P}_0\mathbf{P}_2 P 0 P 2 的中点向P 1 \mathbf{P}_1 P 1 移动,定义的椭圆曲线也会向控制点P 1 \mathbf{P}_1 P 1 移动。如果点远离P 1 \mathbf{P}_1 P 1 ,它定义的曲线也会远离P 1 \mathbf{P}_1 P 1 。因此,我们猜测,这个移动点的位置可以通过控制P 1 \mathbf{P}_1 P 1 的权重来控制。
由于我们只需要一个点,该点受控制点P 1 \mathbf{P}_1 P 1 的权重影响,我们可以用控制点P 0 、 P 1 \mathbf{P}_0、\mathbf{P}_1 P 0 、 P 1 和P 2 \mathbf{P}_2 P 2 定义的有理贝塞尔曲线,它们的权重分别为1 、 w 1、w 1 、 w 和1 1 1 。分配给控制点P 1 \mathbf{P}_1 P 1 的权重将控制额外点的位置。二次有理贝塞尔曲线的系数如下所示:
B 2 , 0 ( u ) = ( 1 − u ) 2 B 2 , 1 ( u ) = 2 ( 1 − u ) u B 2 , 2 ( u ) = u 2 \begin{aligned}&B_{2,0}(u)=&&(1-u)^2\\&B_{2,1}(u)=&&2(1-u)u\\&B_{2,2}(u)=&&u^{2}\end{aligned}
B 2 , 0 ( u ) = B 2 , 1 ( u ) = B 2 , 2 ( u ) = ( 1 − u ) 2 2 ( 1 − u ) u u 2
这个二次有理贝塞尔曲线的方程表示为:
C ( u ) = 1 ( 1 − u ) 2 + 2 ( 1 − u ) u w + u 2 ( ( 1 − u ) 2 P 0 + 2 ( 1 − u ) u w P 1 + u 2 P 2 ) \mathbf{C}(u)=\frac{1}{(1-u)^{2}+2(1-u)uw+u^{2}}\Big((1-u)^{2}\mathbf{P}_{0}+2(1-u)uw\mathbf{P}_{1}+u^{2}\mathbf{P}_{2}\Big)
C ( u ) = ( 1 − u ) 2 + 2 ( 1 − u ) u w + u 2 1 ( ( 1 − u ) 2 P 0 + 2 ( 1 − u ) u w P 1 + u 2 P 2 )
我们将P 0 \mathbf{P}_0 P 0 和P 2 \mathbf{P}_2 P 2 放在x x x 轴的两侧,并使P 0 P 2 \mathbf{P}_0\mathbf{P}_2 P 0 P 2 的中点为坐标原点。因为有理贝塞尔曲线是投影不变的,因此简单的平移和旋转都不会改变曲线的形状。
如下图,我们有P 0 = − P 2 \mathbf{P}_0 = -\mathbf{P}_2 P 0 = − P 2 ,令P 0 P 2 \mathbf{P}_0\mathbf{P}_2 P 0 P 2 的中点为M \mathbf{M} M ,有理贝塞尔曲线与线段M P 1 \mathbf{M}\mathbf{P}_1 M P 1 相交于X \mathbf{X} X 点。
计算一下u = 0.5 u=0.5 u = 0 . 5 处对应曲线上的点C ( u ) C(u) C ( u ) :
C ( 0.5 ) = w 1 + w P 1 \mathbf{C}(0.5)=\frac{w}{1+w}\mathbf{P}_1
C ( 0 . 5 ) = 1 + w w P 1
由于C ( 0.5 ) C(0.5) C ( 0 . 5 ) 和X \mathbf{X} X 是同一点,X \mathbf{X} X 和控制点P 1 \mathbf{P}_1 P 1 位于通过坐标原点M \mathbf{M} M 的同一条直线上,且满足:
∣ M X → ∣ / ∣ M P → 1 ∣ = w 1 + w |\overrightarrow{MX}|/|\overrightarrow{MP}_1| = \frac{w}{1+w}
∣ M X ∣ / ∣ M P 1 ∣ = 1 + w w
如果w = 1 w=1 w = 1 ,有理贝塞尔曲线就成为了贝塞尔曲线,即抛物线。在这种情况下
∣ M X → ∣ / ∣ M P → 1 ∣ = w 1 + w = 1 / 2 |\overrightarrow{MX}|/|\overrightarrow{MP}_1| = \frac{w}{1+w} = 1/2
∣ M X ∣ / ∣ M P 1 ∣ = 1 + w w = 1 / 2
此时点X \mathbf{X} X 是线段M P 1 \mathbf{M}\mathbf{P}_1 M P 1 的中点。
有理贝塞尔曲线如何表示椭圆或双曲线?
从给定圆锥曲线外的点 A \mathbf{A} A 开始,画出两条切线,分别在 X \mathbf{X} X 和 Y \mathbf{Y} Y 处与曲线相交,并画一条任意的割线,使其与弦 X Y \mathbf{X}\mathbf{Y} X Y 在点 C \mathbf{C} C 处相交,并在点 B \mathbf{B} B 和 D \mathbf{D} D 处与圆锥曲线相交,其中 B \mathbf{B} B 在三角形 A X Y \mathbf{A}\mathbf{X}\mathbf{Y} A X Y 内,如下图所示。如果曲线是椭圆,则这些点的顺序是 A 、 B 、 C \mathbf{A}、\mathbf{B}、\mathbf{C} A 、 B 、 C 和 A \mathbf{A} A (图a); 如果它是双曲线,则点 D \mathbf{D} D 位于曲线的另一侧上(图b)!
(a) Ellipse (b) Hyperbola
根据投影的关系,我们有:
∣ D C ∣ ∣ C B ∣ = ∣ D A ∣ ∣ A B ∣ \frac{|\mathrm{DC}|}{|\mathrm{CB}|}=\frac{|\mathrm{DA}|}{|\mathrm{AB}|}
∣ C B ∣ ∣ D C ∣ = ∣ A B ∣ ∣ D A ∣
通过变换可以得到如下关系:
∣ A B ∣ ∣ C B ∣ = ∣ D A ∣ ∣ D C ∣ \frac{|\mathrm{AB}|}{|\mathrm{CB}|}=\frac{|\mathrm{DA}|}{|\mathrm{DC}|}
∣ C B ∣ ∣ A B ∣ = ∣ D C ∣ ∣ D A ∣
因为 ∣ C A ∣ = ∣ C B ∣ + ∣ B A ∣ |\mathbf{CA}| = |\mathbf{CB}| + |\mathbf{BA}| ∣ C A ∣ = ∣ C B ∣ + ∣ B A ∣ ,我们可以按如下方式计算 ∣ C B ∣ / ∣ C A ∣ |\mathbf{CB}|/|\mathbf{CA}| ∣ C B ∣ / ∣ C A ∣ :
∣ C B ∣ ∣ C A ∣ = ∣ C B ∣ ∣ C B ∣ + ∣ B A ∣ = 1 1 + ∣ B A ∣ ∣ C B ∣ = 1 1 + ∣ D A ∣ ∣ D C ∣ \frac{|\mathrm{CB}|}{|\mathrm{CA}|}=\frac{|\mathrm{CB}|}{|\mathrm{CB}|+|\mathrm{BA}|}=\frac{1}{1+\frac{|\mathrm{BA}|}{|\mathrm{CB}|}}=\frac{1}{1+\frac{|\mathrm{DA}|}{|\mathrm{DC}|}}
∣ C A ∣ ∣ C B ∣ = ∣ C B ∣ + ∣ B A ∣ ∣ C B ∣ = 1 + ∣ C B ∣ ∣ B A ∣ 1 = 1 + ∣ D C ∣ ∣ D A ∣ 1
如果曲线是一个椭圆(或者双曲线),我们有 ∣ D A ∣ > ∣ D C ∣ |DA|>|DC| ∣ D A ∣ > ∣ D C ∣ (或者∣ D A ∣ < ∣ D C ∣ |DA|<|DC| ∣ D A ∣ < ∣ D C ∣ ),因此,∣ C B ∣ / ∣ C A ∣ |CB|/|CA| ∣ C B ∣ / ∣ C A ∣ 小于1/2(或大于)。
对于有理贝塞尔曲线,我们有P 0 = X , P 1 = A , P 2 = Y , M = C \mathbf{P}_{0}=\mathbf{X},\mathbf{P}_{1}=\mathbf{A},\mathbf{P}_{2}=\mathbf{Y},\mathbf{M}=\mathbf{C} P 0 = X , P 1 = A , P 2 = Y , M = C 和X = C ( 0.5 ) = B \mathbf{X}=\mathbf{C}(0.5)=\mathbf{B} X = C ( 0 . 5 ) = B 。因此,如果有理贝塞尔曲线表示的是椭圆,有
w 1 + w = ∣ M X ∣ ∣ M P 1 ∣ < 1 2 \frac{w}{1+w}=\frac{|\mathrm{MX}|}{|\mathrm{MP}_1|}<\frac{1}{2}
1 + w w = ∣ M P 1 ∣ ∣ M X ∣ < 2 1
这说明如果 w < 1 w < 1 w < 1 ,有理贝塞尔曲线表示的是椭圆。如果 w > 1 w > 1 w > 1 ,有理贝塞尔曲线表示的是双曲线。
我们有以下结论:
由三个非共线控制点P 0 , P 1 \mathbf{P}_0,\mathbf{P}_1 P 0 , P 1 和 P 2 \mathbf{P}_2 P 2 定义的有理贝塞尔曲线,三个控制点的权重分别为1、w w w 和 1,如果 w > 1 w>1 w > 1 则该曲线是一个双曲线;如果w = 1 w=1 w = 1 ,该曲线是抛物线;如果w < 1 w<1 w < 1 ,该曲线表示椭圆。
圆弧和圆
最后,我们希望能够表示圆弧和圆。前者使用有理贝塞尔曲线,后者使用NURBS 。
由于**圆是椭圆的特例,它们可以使用度数为2的有理贝塞尔曲线表示,唯一的权重w < 1 w<1 w < 1 。**因此,如果我们修改这个权重为特殊值,我们就可以表示圆。
首先,我们知道控制多边形的两条边必须相等,即P 0 P 1 = P 1 P 2 \mathbf{P}_0\mathbf{P}_1=\mathbf{P}_1\mathbf{P}_2 P 0 P 1 = P 1 P 2 。
假设有理贝塞尔曲线表示的圆其圆心和半径分别为 O \mathbf{O} O 和 r \mathbf{r} r ,如下图所示。
弦P 0 P 2 P_0P_2 P 0 P 2 的中点为M \mathbf{M} M ,圆与线段 M P 1 \mathbf{MP}_1 M P 1 相交于 X \mathbf{X} X ,设 P 1 \mathbf{P}_1 P 1 的角度为 2 a 2a 2 a 。我们需要找到一个w w w 的值,使其满足∣ M X ∣ / ∣ M P 1 ∣ = w / ( 1 + w ) |\mathrm{MX}|/|\mathrm{MP}_1|=w/(1+w) ∣ M X ∣ / ∣ M P 1 ∣ = w / ( 1 + w ) ,从而确定定义该圆的有理贝塞尔曲线。
从直角三角形O M P 0 OMP_0 O M P 0 ,我们有∣ O M ∣ = r sin ( a ) |OM| = r \sin(a) ∣ O M ∣ = r sin ( a ) ,因此
∣ M X ∣ = ∣ O X ∣ − ∣ O M ∣ = r − r sin ( a ) = r ( 1 − sin ( a ) ) |\mathrm{MX}|=|\mathrm{OX}|-|\mathrm{OM}|=r-r\sin(a)=r(1-\sin(a))
∣ M X ∣ = ∣ O X ∣ − ∣ O M ∣ = r − r sin ( a ) = r ( 1 − sin ( a ) )
根据直角三角形O P o P 1 OP_oP_1 O P o P 1 ,我们有O P 1 = r / sin ( a ) \mathrm{OP}_1=r/\sin(a) O P 1 = r / sin ( a ) ,因此M P 1 MP_1 M P 1 为:
∣ M P 1 ∣ = ∣ O P 1 ∣ − ∣ O M ∣ = r sin ( a ) − r sin ( a ) = r ( 1 − sin 2 ( a ) ) sin ( a ) |\mathrm{MP}_1|=|\mathrm{OP}_1|-|\mathrm{OM}|=\frac{r}{\sin(a)}-r\sin(a)=\frac{r(1-\sin^2(a))}{\sin(a)}
∣ M P 1 ∣ = ∣ O P 1 ∣ − ∣ O M ∣ = sin ( a ) r − r sin ( a ) = sin ( a ) r ( 1 − sin 2 ( a ) )
现在,我们可以使用∣ M X ∣ / ∣ M P 1 ∣ |\mathrm{MX}|/|\mathrm{MP}_1| ∣ M X ∣ / ∣ M P 1 ∣ 计算,w / ( 1 + w ) w/(1+w) w / ( 1 + w ) :
w 1 + w = ∣ M X ∣ ∣ M P 1 ∣ = sin ( a ) 1 + sin ( a ) \frac{w}{1+w}=\frac{|\mathrm{MX}|}{|\mathrm{MP}_1|}=\frac{\sin(a)}{1+\sin(a)}
1 + w w = ∣ M P 1 ∣ ∣ M X ∣ = 1 + sin ( a ) sin ( a )
求解 w w w ,我们得到一个令人惊讶的结果:唯一权重值 w w w 等于控制点 P 1 \mathbf{P}_1 P 1 处的半角的正弦!
w = sin ( a ) w=\sin(a) w = sin ( a )
这说明:给定三个控制点P 0 , P 1 P_{0},P_{1} P 0 , P 1 和P 2 P_{2} P 2 ,并且满足P 0 P 1 = P 1 P 2 \mathsf{P}_0\mathsf{P}_1=\mathsf{P}_1\mathsf{P}_2 P 0 P 1 = P 1 P 2 ,𝑤 𝑤 w 为P 1 \mathbf{P}_1 P 1 的权重,其中𝑎 𝑎 a 是控制点P 1 \mathbf{P}_1 P 1 角度的一半,此时有理贝塞尔曲线是一个圆。
有两个常见的例子:
四分之一圆
第一个例子是四分之一圆。点P 1 \mathbf{P}_1 P 1 处的角度为90°,a a a 为45度。因此,令w = s i n ( 45 ° ) = 20.5 / 2 w = sin(45°) = 20.5/2 w = s i n ( 4 5 ° ) = 2 0 . 5 / 2 将生成一个四分之一圆。下图显示了这个四分之一圆和由相同控制点集定义的 w = 1 w= 1 w = 1 时的抛物线。
三分之一圆
第二个例子是一个圆的三分之一。由于圆可以内切于一个等边三角形,这个圆的三分之一对应的角度为60度,因此,a a a 为30°。如果令w = s i n ( 30 ° ) = 1 / 2 w=sin(30°) = 1/2 w = s i n ( 3 0 ° ) = 1 / 2 ,那么我们有下面所示的圆弧:
完整圆
我们可以取三个1 / 3 1/3 1 / 3 圆弧或四个1 / 4 1/4 1 / 4 圆弧,然后将它们拼接在一起组成一个完整的圆,如下图所示。但是,它是如何表示的?它必须是一个二次NURBS曲线。因此我们需要控制点和节点信息。
让我们首先考虑等边三角形的情况。
如上图左侧所示。每个等边三角形的顶点都是先前描述的权重为1 / 2 1/2 1 / 2 的控制点。
左下方的1 / 3 1/3 1 / 3 由控制点 P 0 \mathbf{P}_0 P 0 ,P 1 \mathbf{P}_1 P 1 和 P 2 \mathbf{P}_2 P 2 定义;
顶部的1 / 3 1/3 1 / 3 由 P 2 \mathbf{P}_2 P 2 ,P 3 和 P 4 \mathbf{P}_4 P 4 定义;
右下方的1 / 3 1/3 1 / 3 由 P 4 \mathbf{P}_4 P 4 ,P 5 \mathbf{P}_5 P 5 和 P 6 = P 0 \mathbf{P}_6 = \mathbf{P}_0 P 6 = P 0 定义。
接下来,我们要研究节点。由于 n = 6 , p = 2 n = 6,p = 2 n = 6 , p = 2 ,那么 m = 6 + 2 + 1 m = 6 + 2 + 1 m = 6 + 2 + 1 (即,10 个节点)。在这 10 个节点中,前三个和后三个是 0 和 1(即u 0 = u 1 = u 2 = 0 , u 7 = u 8 = u 9 = 1 u_0 = u_1 = u_2 = 0,u_7 = u_8 = u_9 = 1 u 0 = u 1 = u 2 = 0 , u 7 = u 8 = u 9 = 1 )。
到目前为止,未知的节点是 u 3 , u 4 , u 5 u_3,u_4,u_5 u 3 , u 4 , u 5 和 u 6 u_6 u 6 。
一种方式是将1 / 3 1/3 1 / 3 和2 / 3 2/3 2 / 3 作为内部节点,因为在区间 [ 0 , 1 / 3 ] , [ 1 / 3 , 2 / 3 ] [0, 1/3],[1/3, 2/3] [ 0 , 1 / 3 ] , [ 1 / 3 , 2 / 3 ] 和 [ 2 / 3 , 1 ] [2/3, 1] [ 2 / 3 , 1 ] 上的圆弧将整个圆分成三个等长的圆弧。因此,我们还需要两个节点。
在上图中,你会看到控制点P 2 \mathbf{P}_2 P 2 位于圆上,其位置是其长度的1 / 3 1/3 1 / 3 。
我们如何让曲线通过一个控制点呢?可以采用de Boor 算法。当计算一个B样条/NURBS曲线上对应于u u u 的点时,我们将u u u 多次插入,直到u u u 的重数是p p p ,其中p p p 是曲线的次数。当最后一次插入u u u 时,曲线上对应的点实际上是一个(新)控制点P 2 \mathbf{P}_2 P 2 !
这个结论告诉我们,如果1 / 3 1/3 1 / 3 的重数是2,那么曲线上对应的点是一个控制点。
因此可以得到u 3 = u 4 = 1 / 3 u_3 = u_4 = 1/3 u 3 = u 4 = 1 / 3 和u 5 = u 6 = 2 / 3 u_5 = u_6 = 2/3 u 5 = u 6 = 2 / 3 。
我们有结论:
要用等边三角形形定义一个完整的圆,我们要有节点0 , 0 , 0 , 1 / 3 , 1 / 3 , 2 / 3 , 2 / 3 , 1 , 1 , 1 0,0,0,1/3,1/3,2/3,2/3,1,1,1 0 , 0 , 0 , 1 / 3 , 1 / 3 , 2 / 3 , 2 / 3 , 1 , 1 , 1
要用一个正方形定义一个完整的圆,我们需要如图所示的九个控制点和节点向量0 , 0 , 0 , 1 / 4 , 1 / 4 , 1 / 2 , 1 / 2 , 3 / 4 , 3 / 4 , 1 , 1 , 1 0,0,0,1/4,1/4,1/2,1/2,3/4,3/4,1,1,1 0 , 0 , 0 , 1 / 4 , 1 / 4 , 1 / 2 , 1 / 2 , 3 / 4 , 3 / 4 , 1 , 1 , 1
那么,如何用一个有n n n 条边的正多边形来定义一个完整的圆?