目录
B-Spline 学习笔记(MOOC)
[1] B样条产生的背景
1. Bezier曲线的不足
Bezier曲线曲面有很多优点,可以用鼠标拖动控制顶点,改变曲线的形状,非常直观,给设计人员很大的自由度。但Bezier曲线有几点不足:
- 一旦确定了控制点数(n+1个),则曲线阶次确定(n次),当顶点数过多时,Bezier的阶次很高。且高次Bezier的导数会有很多零点,造成曲线出现过多极值点,表现为曲线的震荡。
- 为了克服这一现象,可以采用分段Bezier曲线拼接的方式。但Bezier曲线或曲面的拼接又比较复杂。因为拼接过程需要满足拼接点的0阶、1阶甚至更高阶连续性,条件比较复杂苛刻。
- Bezier曲线或曲面无法进行局部修改,因为伯恩斯坦基函数的在整个区间都有值,即整个曲线的区间都是伯恩斯坦基函数的支撑区间。
2. 克服不足的方法
考虑下图所示的混合函数:
每个函数只在区间[0,1]上的一部分有支撑,这样的混合函数作为基函数的话,就不会像伯恩斯坦基函数一样出现“牵一发而动全身”的情形。
1972年,Gordon、Rinsenfeld等人提出B样条方法,在保留Bezier方法全部优点的同时,克服Bezier方法的弱点即 样条(Spline)——分段连续多项式
整条曲线用一个完整的表达形式,但内在的量是一段段的,比如用一堆的三次曲线拼接,两两间满足2次几何连续。
这样既克服波动现象,又能使曲线是低次的,即有统一的表达又有统一的算法。
3. 如何进行分段?
有n+1个点,每两点之间构造一条三次多项式,n+1个点有n个小区间,就变成了n个三次多项式拼接在一起,段与段之间满足二次连续,这就是三次样条。
当有5个点的时候,采用三次样条的方式构造曲线,那么可以构造出4段曲线,每一段曲线是三次多项式,且段与段之间满足二次连续。而5个控制点用Bezier构造曲线时,多项式曲线为四次。
[2] B样条的递推定义
1. B-Spline与Bezier Curve
B-Spline的数学表达式为(索引i表示控制点,索引k表示阶数,阶数=次数+1):
形式上和Bezier曲线相似:
相同点: 都有n+1个控制点,Pi为控制多边形矢量。
不同点:
- B样条的基函数为
B
i
,
k
B_{i,k}
Bi,k ,而Bezier曲线的基函数为
B
i
,
n
B_{i,n}
Bi,n
这说明对于Bezier曲线来说,其基函数的次数和控制点的个数是必定联系起来的,而对于B样条来说,其基函数与控制点的个数没有关系。 - Bezier的参数 u u u取值范围为[0,1],而B样条的参数取值范围是[ u k − 1 , u n + 1 u_{k-1},u_{n+1} uk−1,un+1],这个原因后边会介绍到。
2. B样条基函数
-
阶数
B i , k B_{i,k} Bi,k称为k阶(k-1次)B样条基函数,k刻画次数,可以是2~控制点个数n+1之间的任意整数。
当B样条基函数为二阶,则其为1次多项式。
这里需要注意,Bezier的阶数和次数是一样的(都是控制点数-1),而对于B样条来说,阶数是次数加一。
-
节点向量
B样条基函数是一个称为节点矢量的非递减的参数u的序列所决定的k阶分段多项式,这个序列称为节点向量。
B样条基函数实际上就是一个多项式,是一个比较复杂的、有特点的多项式,如何得到这个B样条基函数?B样条定义方式多种多样,但公认的最容易理解的是de Boor-Cox递推定义。
3. de Boor-Cox递推公式
只要是k阶(k-1次)的B样条基函数,构造一种递推的公式,由0次构造1次,由1次构造2,以此类推。递推定义如下:
可以看出,k阶B样条基函数是由两个k-1阶的基函数线性组合而成的。为了防止分子分母都为0的情况出现,约定0/0=0
-
基函数支撑区间
观察分子,可以发现,若确定第i个k阶B样条基函数 B i , k ( u ) B_{i,k}(u) Bi,k(u),需要用到 u i , u i + 1 , . . . u i + k u_i, u_{i+1}, ... u_{i+k} ui,ui+1,...ui+k共k+1个节点,称区间[ u i , u i + k u_i, u_{i+k} ui,ui+k]为 B i , k ( u ) B_{i,k}(u) Bi,k(u)的支撑区间。
-
一阶B样条基函数
“0次多项式”
-
二阶B样条基函数
可以由两个一阶B样条曲线递推得到,是它们的凸组合。
-
三阶B样条基函数
根据样条曲线的定义式,每一个控制点 p i p_i pi都有一个基函数 B i , k ( u ) B_{i,k}(u) Bi,k(u)与之匹配,其曲线次数为k-1次。问题是这条曲线的定义区间是什么?
Bezier的定义区间是[0,1],那么B样条的定义区间呢?
对n+1个顶点,k阶的B样条曲线需要多少个节点向量与之匹配?
[3] B样条的定义区间与节点向量
1. k阶B样条对应的节点向量数
-
k阶基函数涉及到的区间
根据de Boor-Cox递推公式,可知k阶基函数涉及到的区间,为[ u i , u i + k u_i, u_{i+k} ui,ui+k],如果把相邻节点之间的区间认为是一个小区间,那么k阶基函数涉及到k个小区间,k+1个节点。 -
n+1个k阶基函数涉及到的区间
当给定n+1个控制点,用k阶B-Spline生成曲线,需要用到 B 0 , k ( u ) B_{0,k}(u) B0,k(u), B 1 , k ( u ) B_{1,k}(u) B1,k(u), … , B n , k ( u ) B_{n,k}(u) Bn,k(u)个k阶基函数,那么这些基函数涉及到的区间为[ u 0 , u n + k u_0, u_{n+k} u0,un+k],共n+k+1个节点,n+k个小区间, 即节点向量为:
2. B样条函数的定义区间
按照给出的定义,u定义在区间[ u k − 1 , u n + 1 u_{k-1}, u_{n+1} uk−1,un+1]上,那么这个区间是怎么来的呢?
以k=4,n=4为例:
按照[3]-1的第二条所说,这里有5个控制点,需要用到5个4阶B样条函数,这五个基函数涉及到的区间为[
u
0
,
u
n
+
k
u_0, u_{n+k}
u0,un+k] = [
u
0
,
u
8
u_0, u_{8}
u0,u8],即节点向量为:
进一步地按照[3]-1的第二条来分析每个基函数所涉及的区间,可以得到:
B
0
,
4
(
u
)
B_{0,4}(u)
B0,4(u)涉及到的区间为[
u
0
,
u
4
u_0, u_4
u0,u4]
B
1
,
4
(
u
)
B_{1,4}(u)
B1,4(u)涉及到的区间为[
u
1
,
u
5
u_1, u_5
u1,u5]
B
2
,
4
(
u
)
B_{2,4}(u)
B2,4(u)涉及到的区间为[
u
2
,
u
6
u_2, u_6
u2,u6]
B
3
,
4
(
u
)
B_{3,4}(u)
B3,4(u)涉及到的区间为[
u
3
,
u
7
u_3, u_7
u3,u7]
B
4
,
4
(
u
)
B_{4,4}(u)
B4,4(u)涉及到的区间为[
u
4
,
u
8
u_4, u_8
u4,u8]
这里提到,区间要合法,区间必须要有足够的基函数与顶点配对。
这句话的含义个人理解为,如果某个区间为基函数的支撑区间,即该区间里基函数有值,那么对应的
P
i
B
n
,
k
(
u
)
P_iB_{n,k}(u)
PiBn,k(u)就会生效(不为零),即基函数匹配的顶点可以产生对曲线的控制作用,那按照我们的理解,这里的4阶样条曲线,曲线是3次的,类比Bezier Curve,需要4个控制点,那么就需要区间上有4个控制点生效,也就是有4个基函数的支撑区间经过该区间,上面的图就应该找到[
u
3
,
u
5
u_3, u_5
u3,u5]这个区间作为B-Spline的定义区间,相当于上述曲线被分为两段,
u
3
u
4
u_3u_4
u3u4、
u
4
u
5
u_4u_5
u4u5,
P
0
,
P
1
,
P
2
,
P
3
P_0, P_1, P_2, P_3
P0,P1,P2,P3控制第一段,
P
1
,
P
2
,
P
3
,
P
4
P_1, P_2, P_3, P_4
P1,P2,P3,P4控制第二段。两段之间有三个顶点是一样的,这样就保证了两段拼接的效果非常好。
推广一下,就可以得到k阶样条曲线的定义区间为[ u k − 1 , u n + 1 u_{k-1}, u_{n+1} uk−1,un+1]
* 对B-Spline,阶数 = (次数+1) = 次数 = 每段生效的控制点数量
可见B样条基函数严重依赖于节点向量的分布。
3. B样条曲线完整定义
[4] B样条基函数的主要性质
1. 局部支撑性
Bezier基函数整个区间非0,即整个区间都是各基函数的支撑区间;而B-Spline的基函数的支撑区间为区间的一部分。
2. 权性
在定义空间内,各基函数值之和时刻为1
3. 连续性
r重节点处基函数的连续阶不低于k-1-r,实际上就是当节点不重合时(1重节点),k阶(k-1次)B-Spline可以达到k-2阶连续。
4. 分段参数多项式
B i , k ( u ) B_{i,k}(u) Bi,k(u)在每个长度非零的区间[ u i , u i + 1 u_{i}, u_{i+1} ui,ui+1)上都是次数不高于k-1的多项式,它在整个参数轴上是分段多项式。
[4] B样条函数的主要性质
1. 局部性
k阶B样条曲线上的一点至多与k个控制顶点有关,与其他控制顶点无关。移动曲线一个控制顶点,至多影响定义在区间上那部分曲线的形状,对曲线的其它部分不发生影响。
2. 变差缩减性
同Bezier曲线,类似凸包性,不赘述。
3. 几何不变性
同Bezier曲线,不赘述。
4. 凸包性
同Bezier曲线,曲线落在控制顶点构成的凸包中。
[5] B样条曲线类型
1. 均匀B样条曲线 Uniform B-Spline Curve
即节点沿参数轴均匀等距分布,e.g.{0,1,2,3,4,5,6}
均匀B样条的基函数呈周期性,即给定n和k,所有的基函数有相同形状,每个后续基函数仅为前面基函数在新位置上的重复。
2. 准均匀B样条曲线 Quasi-Uniform B-Spline Curve
两端节点具有重复度k,e.g.{0,0,0,1,2,3,4,5,5,5}
准均匀B样条曲线保留了Bezier曲线端点的几何性质,即过首末控制点,这是均匀B样条曲线做不到的。
3. 分段Bezier曲线 Piecewise Bezier Curve
两端节点具有重复度k,所有内节点重复度为k-1,这样的节点矢量定义了分段的Bernstein基函数。
这说明Bezier曲线是B-Spline的一个特例,B样条曲线也可以用分段的Bezier曲线拼接而成,这样的好处是各曲线段具有了相对的独立性。(各段控制点不交叠?)