B样条曲线
1、B样条曲线的由来
在B样条曲线诞生之前,先有的是贝塞尔曲线(Bezier),由于贝塞尔曲线的一部分不足,引出了B样条曲线。
1.1 贝塞尔曲线的由来
给定
n
+
1
{n+1}
n+1个数据点,
p
0
p_0
p0~
p
n
p_n
pn,能够生成一条曲线,使得该曲线与这些点描述的形状相符。
1.2 贝塞尔曲线的定义
p
t
=
∑
i
=
0
n
p
i
B
i
,
n
(
t
)
(
1
)
\ {p_t}=\sum_{i=0}^n p_i B_{i,n}(t)\qquad (1)
pt=i=0∑npiBi,n(t)(1)
Bezier曲线的基函数可以简化成伯恩斯坦基函数
B
i
,
n
(
t
)
B_{i,n}(t)
Bi,n(t),其中
B
i
,
n
(
t
)
=
n
!
i
!
(
n
−
i
)
!
t
i
(
1
−
t
)
n
−
i
,
t
∈
[
0
,
1
]
(
2
)
\ B_{i,n}(t)=\frac{n!}{i!{(n-i)}!}t^i(1-t)^{n-i} , t\in[0,1]\qquad (2)
Bi,n(t)=i!(n−i)!n!ti(1−t)n−i,t∈[0,1](2)
贝塞尔的参数B是二项式
(
t
+
(
1
−
t
)
)
n
=
(
1
)
n
(t+(1-t))^n = (1)^n
(t+(1−t))n=(1)n的展开公式。后面的很多的贝塞尔曲线的性质都可以用这个来解释。
二项式定理:
(
x
+
y
)
n
=
∑
i
=
0
n
C
n
i
x
n
−
i
y
i
(x+y)^n = \sum_{i=0}^nC_n^ix^{n-i}y^i
(x+y)n=i=0∑nCnixn−iyi
根据此定理,可以将
x
+
y
x+y
x+y的任意次幂展开成和的形式
贝塞尔曲线可以通过递归的方式来绘制,也更便于理解。
贝塞尔曲线的导数还是贝塞尔曲线。
1.3 贝塞尔曲线的例子
(1)一次Bezier曲线
当
n
=
1
n=1
n=1时,有两个控制点
p
0
p_0
p0和
p
1
p_1
p1,Bezier多项式是一次多项式:
p
t
=
∑
i
=
0
1
p
i
B
i
,
1
(
t
)
=
p
0
B
0
,
1
(
t
)
+
p
1
B
1
,
1
(
t
)
=
(
1
−
t
)
p
0
+
t
p
1
(
3
)
\ {p_t}=\sum_{i=0}^1 p_i B_{i,1}(t)=p_0 B_{0,1}(t)+p_1 B_{1,1}(t)=(1-t)p_0+tp_1\qquad (3)
pt=i=0∑1piBi,1(t)=p0B0,1(t)+p1B1,1(t)=(1−t)p0+tp1(3)
即为连接起点
p
0
p_0
p0和终点
p
1
p_1
p1的直线段。
(2)二次Bezier曲线
当
n
=
2
n=2
n=2时,有3个控制点p0、p1和p2,Bezier多项式是二次多项式:
p
t
=
∑
i
=
0
2
p
i
B
i
,
2
(
t
)
=
p
0
B
0
,
2
(
t
)
+
p
1
B
1
,
2
(
t
)
+
p
2
B
2
,
2
(
t
)
=
(
1
−
t
)
2
p
0
+
2
t
(
1
−
t
)
p
1
+
t
2
p
2
(
4
)
\ {p_t}=\sum_{i=0}^2 p_i B_{i,2}(t)=p_0 B_{0,2}(t)+p_1 B_{1,2}(t)+p_2 B_{2,2}(t)=(1-t)^2p_0+2t(1-t)p_1+t^2p_2\qquad (4)
pt=i=0∑2piBi,2(t)=p0B0,2(t)+p1B1,2(t)+p2B2,2(t)=(1−t)2p0+2t(1−t)p1+t2p2(4)
2、B样条曲线的定义
B样条曲线的数学表达式为:
p
u
=
∑
i
=
0
n
p
i
B
i
,
k
(
u
)
,
u
∈
[
u
k
−
1
,
u
n
+
1
]
(
5
)
\ {p_u}=\sum_{i=0}^n p_i B_{i,k}(u), u\in[u_{k-1},u_{n+1}]\qquad (5)
pu=i=0∑npiBi,k(u),u∈[uk−1,un+1](5)
B
i
,
k
(
u
)
B_{i,k}(u)
Bi,k(u)称为
k
k
k阶
(
k
−
1
)
(k-1)
(k−1)次B样条基函数,k是刻画次数的。其中k可以是2到控制点个数
n
+
1
n+1
n+1之间的任意整数。
对Bezier曲线来说,阶数和次数是一样的;但对B样条,阶数是次数加1。
B样条基函数是一个称为节点矢量的非递减的参数u的序列所决定的k阶分段多项式,这个序列称为节点向量。
与贝塞尔曲线类似,B样条曲线也可以用递归的方式定义。
de Boor-Cox递推定义
它的原理是,只要是
k
k
k阶
k
−
1
k-1
k−1(次)的B样条基函数,构造一种递推的公式,由0次构造1次,1次构造2次,2次构造3次,依此类推。
B
i
,
1
(
u
)
=
{
1
,
u
∈
(
u
i
,
u
i
+
1
)
0
,
其它
(
6
)
B_{i,1}(u)=\begin{cases} 1 , u\in(u_{i},u_{i+1})\\ 0, 其它 \end{cases}\qquad (6)
Bi,1(u)={1,u∈(ui,ui+1)0,其它(6)
B
i
,
k
(
u
)
=
u
−
u
i
u
i
+
k
−
1
−
u
i
B
i
,
k
−
1
(
u
)
+
u
i
+
k
−
u
u
i
+
k
−
u
i
−
1
B
i
+
1
,
k
−
1
(
u
)
(
7
)
\ B_{i,k}(u)=\frac{u-u_i}{u_{i+k-1}-u_i}B_{i,k-1}(u)+\frac{u_{i+k}-u}{u_{i+k}-u_{i-1}}B_{i+1,k-1}(u)\qquad (7)
Bi,k(u)=ui+k−1−uiu−uiBi,k−1(u)+ui+k−ui−1ui+k−uBi+1,k−1(u)(7)
并约定
0
0
=
0
\frac{0}{0}=0
00=0
该递推公式表明:若确定第
i
i
i个
k
k
k阶B样条
B
i
,
k
(
u
)
B_{i,k}(u)
Bi,k(u),需要用到
u
i
,
…
…
u
i
+
k
u_i,……u_{i+k}
ui,……ui+k,共
k
+
1
k+1
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
i
,
k
(
u
)
B_{i,k}(u)
Bi,k(u)不为0的区间。
3、B样条基函数定义区间及节点向量
合法的定义区间必须满足在该区间有足够多的基函数不为0,利用B样条基函数递推定义,据此推出B样条基函数的定义区间为
[
u
k
−
1
,
u
n
+
1
]
[u_{k−1},u_{n+1}]
[uk−1,un+1]。同时阶数
k
k
k加控制点
n
+
1
n+1
n+1为节点向量的个数。
4、B样条曲线是多段贝塞尔曲线拼接的理解
假设控制点的个数为
n
+
1
n+1
n+1,阶数为
k
k
k,根据递推定义则有:
p
0
B
0
,
4
(
u
)
p_0 B_{0,4}(u)
p0B0,4(u),涉及u_0到u_4个节点
p
1
B
1
,
4
(
u
)
p_1 B_{1,4}(u)
p1B1,4(u),涉及u_1到u_5个节点
p
2
B
2
,
4
(
u
)
p_2 B_{2,4}(u)
p2B2,4(u),涉及u_2到u_6个节点
p
3
B
3
,
4
(
u
)
p_3 B_{3,4}(u)
p3B3,4(u),涉及u_3到u_7个节点
p
4
B
4
,
4
(
u
)
p_4 B_{4,4}(u)
p4B4,4(u),涉及u_4到u_8个节点
所以B样条曲线被分成俩段:
u
3
u_3
u3
u
4
u_4
u4,
u
4
u_4
u4
u
5
u_5
u5。
刚好
p
0
p_0
p0、
p
1
p_1
p1、
p
2
p_2
p2、
p
3
p_3
p3对应的基函数是在
u
3
u_3
u3
u
4
u_4
u4区间里有定义,
p
1
p_1
p1、
p
2
p_2
p2、
p
3
p_3
p3、
p
4
p_4
p4对应的基函数是在
u
4
u_4
u4
u
5
u_5
u5区间里有定义。
因为B样条曲线是3次的,这里单个节点区间又对应了4个有效的控制点,则在单个节点区间里的B样条曲线可以用贝塞尔曲线代替。因为
4
4
4个控制点会有一条
3
3
3阶的贝塞尔曲线,目的是找一条逼近控制点的曲线,这样就找到了。又因为相邻俩段之间有三个控制点是一样的,这样就会保证相邻俩段贝塞尔曲线的拼接效果非常好。
即每一个有效定义的节点区间内都可以看作一个贝塞尔曲线。
可以用贝塞尔曲线B样条曲线代替单个节点向量区间对应的曲线是因为对应的控制点一样,同时贝塞尔曲线与控制点的逼近效果很好。
参考:
https://blog.csdn.net/qq_40597317/article/details/81155571
https://blog.csdn.net/weixin_42513339/article/details/83118099
https://blog.csdn.net/weixin_45971567/article/details/105629924