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
四个样条函数(基函数)
\begin{align}
f_1(s)&=\frac{1}{6}(-s^3+3s^2-3s+1) \\
f_2(s)&=\frac{1}{6}(3s^3-6s^2+4) \\
f_3(s)&=\frac{1}{6}(-3s^3+3s^2+3s+1) \\
f_4(s)&=\frac{1}{6}s^3
\end{align}
其中:
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⎦⎥⎥⎥⎤
根据起始点增广的形式我们可以得出:
\begin{align}
C_{1}&=C_{O1}-V_1L \\
C_{2}&=C_{O1} \\
C_{3}&=C_{O1}+V_1L
\end{align}
可以看出,这种定义使得原本的C1(或Cn)在增广后的三点连线的中点,如下图所示
所以为了回答**”给定控制点[C1 C2 ... CN],如何保证P(S)过起点C1?”**
我们可以将增广点代入上式,可得:
\begin{align}
P(s)&=\frac{1}{6}
\begin{bmatrix}
1 & s & s^2 & s^3 \\
\end{bmatrix}
\begin{bmatrix}
C_2+V_1L+4C_2+C_2-V_1L \\
-3C_2-3V_1L+3C_2-3V_1L \\
3C_2+3V_1L-6C_2+3C_2-3V_1L \\
-C_2-V_1L+3C_2-3C_2+3V_1L+C_4
\end{bmatrix}
\\
\\
&=\frac{1}{6}
\begin{bmatrix}
1 & s & s^2 & s^3 \\
\end{bmatrix}
\begin{bmatrix}
6C_2 \\
-6V_1L \\
0 \\
-C_2+C_4+2V_1L
\end{bmatrix}
\\
\\
&=
\begin{bmatrix}
1 & s & s^2 & s^3 \\
\end{bmatrix}
\begin{bmatrix}
C_2 \\
-V_1L \\
0 \\
\frac{1}{6}(-C_2+C_4+2V_1L)
\end{bmatrix}
\end{align}
当s=0时,即在样条曲线起点:
P(0)=C2
当我们重新在看这张图片时,就会恍然大悟了
当然,对于终点CN,同理:
\begin{align}
C_{N-2}&=C_{ON}-V_NL \\
C_{N-1}&=C_{ON} \\
C_{N} &=C_{ON}+V_NL
\end{align}
代入增广矩阵方程:
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样条也不同,最终方向取决于实际需求