BSpline 三次B样条曲线
BSpline 三次B样条曲线简介与推导
BSpline 三次B样条曲线
B样条
P(u)=i=0∑nPiBi,k(u)u∈[uk−1,un+1]
四点三次B样条曲线
P(s)=f1(s)C1+f2(s)C2+f3(s)C3+f4(s)C4
四个样条函数(基函数)
f1(s)f2(s)f3(s)f4(s)=61(−s3+3s2−3s+1)=61(3s3−6s2+4)=61(−3s3+3s2+3s+1)=61s3
其中:
s为归一化路径:0≤s≤1
超过四个点?
如果超过了四个点位,我们是否要用更高次幂的函数来拟合?
这样会需要更复杂的运算,并且会导致牵一发而动全身的缺点,无法进行局部调整
当然,也有这种曲线,就是贝塞尔曲线(Bézier Curves)
贝塞尔曲线
Photoshop中三阶贝塞尔曲线
四点三阶B样条
也就是:
过起始点的B样条曲线
上述样条曲线在四点中间,并不过起始点,无法达到我们的拟合或者路径规划的任务
为了能够过起始点,我们采用在起始点添加对称的增广点:
但是采用这种增广模式,如何保证如何保证P(S)过起点C1?
让我们算一算
上式也可以写成矩阵形式:
P(s)=61[1ss2s3]⎣⎢⎢⎢⎡1−33−140−63133−30001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡C1C2C3C4⎦⎥⎥⎥⎤
根据矩阵乘法结合率可知:(AB)C=A(BC)
P(s)=61[1ss2s3]⎣⎢⎢⎢⎡C1+4C2+C3−3C1+3C33C1−6C2+3C3−C1+3C2−3C3+C4⎦⎥⎥⎥⎤
根据起始点增广的形式我们可以得出:
C1C2C3=CO1−V1L=CO1=CO1+V1L
可以看出,这种定义使得原本的C1(或Cn)在增广后的三点连线的中点,如下图所示
所以为了回答**”给定控制点[C1 C2 ... CN],如何保证P(S)过起点C1?”**
我们可以将增广点代入上式,可得:
P(s)=61[1ss2s3]⎣⎢⎢⎢⎡C2+V1L+4C2+C2−V1L−3C2−3V1L+3C2−3V1L3C2+3V1L−6C2+3C2−3V1L−C2−V1L+3C2−3C2+3V1L+C4⎦⎥⎥⎥⎤=61[1ss2s3]⎣⎢⎢⎢⎡6C2−6V1L0−C2+C4+2V1L⎦⎥⎥⎥⎤=[1ss2s3]⎣⎢⎢⎢⎡C2−V1L061(−C2+C4+2V1L)⎦⎥⎥⎥⎤
当s=0时,即在样条曲线起点:
P(0)=C2
当我们重新在看这张图片时,就会恍然大悟了
当然,对于终点CN,同理:
CN−2CN−1CN=CON−VNL=CON=CON+VNL
代入增广矩阵方程:
P(s)=61[1ss2s3]⎣⎢⎢⎢⎡1−33−140−63133−30001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡CN−3CN−2CN−1CN⎦⎥⎥⎥⎤
太复杂了,不想手算了 😦
根据MATLAB符号运算工具可知:
P(1)=CN−1
即最后三点的中点,原始控制点的终点!
当然如果我们改变增广点的位置,使其不对称,就会出现以下情况:
对应图像变化:
是两点中点吗?
show me your code
当然我们可以通过MATLAB符号运算工具轻松得出任意增广点位的起始点和终点情况:
即:
P(0)=C2−6V11L+6V12LP(1)=CN−1−6VN1L+6VN2L
三次B样条在起始点速度对样条的影响
从应用角度:

针对第二个入库问题,下列哪个是最合适的解法:

所以,起始点的速度V不同(方向和大小),最后生成的B样条也不同,最终方向取决于实际需求