文章目录
B样条曲线,是B-样条基函数的线性组合,是贝塞尔曲线的一般化。
1. B-spline Basis Functions
1.1 B样条基函数的定义
由de Boor和Cox分别导出B样条基函数的递推定义,B样条基函数可以表示为:
并约定
0
/
0
=
0
0/0=0
0/0=0。式中
p
p
p表示B样条的幂次,
u
u
u为节点,下标
i
i
i为B样条的序号。
上式表明,任意 p p p次B样条基函数可由两个相邻的 p − 1 p−1 p−1次B样条基函数的线性组合构成。
B样条基函数的三角计算:
1.2 B样条基函数的性质
- N i , p ( u ) N_{i,p}(u) Ni,p(u)是关于 u u u的 p p p次多项式.
- 如果 u ∉ [ u i , u i + p + 1 ) u∉[u_i,u_{i+p+1}) u∈/[ui,ui+p+1),则 N i , p ( u ) = 0 N_{i,p}(u)=0 Ni,p(u)=0
- 当 u ∈ [ u i , u i + 1 ) u∈[u_i,u_{i+1}) u∈[ui,ui+1)时,至多存在 p + 1 p+1 p+1个 p p p次基函数,即 N i − p , p ( u ) , N i − p + 1 , p ( u ) , . . . , N i , p ( u ) N_{i-p,p}(u), N_{i-p+1,p}(u), ..., N_{i,p}(u) Ni−p,p(u),Ni−p+1,p(u),...,Ni,p(u)非0.
- 当 u ∈ [ u i , u i + 1 ) u∈[u_i,u_{i+1}) u∈[ui,ui+1)时, ∑ j = i − p i N j , p ( u ) = 0 \sum\limits_{j=i-p}^{i}N_{j,p}(u)=0 j=i−p∑iNj,p(u)=0.
- 如果节点数量为 m + 1 m+1 m+1,B样条基函数的次数为 p p p,个数为 n + 1 n+1 n+1,则 m = n + 1 + p m=n+1+p m=n+1+p.
- B样条基函数 N i , p ( u ) N_{i,p}(u) Ni,p(u)在 k k k重节点 u u u处 C p − k C^{p-k} Cp−k连续.
2. B-spline Curves
2.1 定义
给定 n + 1 n+1 n+1个控制点, P 0 , P 1 , … , P n P_0,P_1, …, P_n P0,P1,…,Pn以及一个节点向量 U U U={ u 0 u_0 u0, u 1 u_1 u1, …, u m u_m um}, p p p次B-样条曲线由这些控制点和节点向量 U U U定义:
open B-spline curves:
clamped B-spline curves:
closed B-spline curves:
2.2 性质
- B样条曲线是次数为 p p p的分段曲线组合.
- m = n + p + 1 m = n + p + 1 m=n+p+1.
- Clamped B样条曲线经过 p 0 p_0 p0, p n p_n pn两个控制点.
- 强凸包性:
当 u ∈ [ u i , u i + 1 ) u∈[u_i,u_{i+1}) u∈[ui,ui+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 Pi−p,Pi−p+1,...,Pi组成的凸包内. - 局部修改特性:
改变控制点 P i P_i Pi的位置,只会影响处在 [ u i , u i + p + 1 ) [u_i,u_{i+p+1}) [ui,ui+p+1)区间内的曲线段 C ( u ) C(u) C(u). - C ( u ) C(u) C(u)在 k k k重节点 u u u处 C p − k C^{p-k} Cp−k连续.
- 变差递减性.
- 贝塞尔曲线是B样条曲线的特例.
- 仿射不变性.
2.3 系数计算
计算公式:
示意图:
算法流程:
2.4 改变B样条曲线形状
改变B样条曲线形状可以通过两种方式:
-
移动控制点
-
修改节点位置
实践表明,由于不清楚B样条曲线的形状是如何随着节点向量的改变而发生变化的,通过修改节点位置来改变B样条曲线的形状通常很难达到预期的结果。
2.5 B样条曲线的微分
计算公式:
Byang
B样条曲线的微分仍是一条定义在n个控制点 Q 0 , Q 1 , . . . , Q n − 1 Q_0, Q_1, ..., Q_{n-1} Q0,Q1,...,Qn−1上的次数为 p − 1 p-1 p−1的B样条曲线.
证明可采用数学归纳法,参考B样条曲线曲面介绍
由B样条曲线的微分计算公式,可以推导得出以下关于Clamped B样条曲线的结论:
Clamped B样条曲线通过第一个和最后一个控制点,并与控制多段线的第一个和最后一个支路相切。
3. Important Algorithms for B-spline Curves
3.1 Knot Insertion
3.1.1 单点单次插入
单点插入示意图:
计算公式:
计算流程示意图:
3.1.2 同一节点重复多次插入
计算公式:
插入1次:
插入2次:
插入3次:
插入 h h h次:
算法流程:
3.2 De Boor’s Algorithm
De Boor 算法是 Casteljau 算法的推广。它提供了一种快速且数值稳定的方法来寻找给定区域内,B样条曲线上对应节点 u u u的点。
示意图:
如图所示, P k − s , p − s P_{k-s,p-s} Pk−s,p−s即为所找的点 C ( u ) C(u) C(u).
算法流程如下:
3.3 B样条曲线的分割
将B样条曲线在节点u处分割为两段,一段在[0,u]上,另一段在[u,1]上.
1.使用De Boor算法进行分割得到控制点:
2.两段曲线的节点向量:
第一段:原来 [ 0 , u ) [0,u) [0,u)上的所有节点 + p 个 u p个u p个u.
第二段: p 个 u p个u p个u + 原来 ( u , 1 ] (u,1] (u,1]上的所有节点.