B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。
同时B样条分为准均匀和非均匀,以下为准均匀为例。
参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhuanlan.zhihu.com/p/50626506
参考链接2:
https://zhuanlan.zhihu.com/p/536470972https://zhuanlan.zhihu.com/p/536470972参考链接3:
参考链接6:
具体的原理我在这里不进行详细讲解,比如Lagrange插值,Runge现象等等,上面的文章讲解的就非常详细。总得来说B样条是贝塞尔曲线的一部分,类似。这篇文章的重点是如何使用,B样条最终的公式是:
但是这里还是要说一下,最基本的东西,对于b样条来说
阶数:函数最高阶数(二次样条就是2,用3次样条是3)
节点(数)向量:阶数+控制点数+1
(这里的阶数可以改的,比如用二次样条就是2,用3次样条是3)
基本函数: 基本函数就是Ni,k(t),这个怎么看呢,看下面的这个表
已知节点数为10, 有5个控制点,根据公式为5 + 4 + 1 = 10 ,也就是最好可以用4次样条。(9组范围)根据图片所示,当使用4次样条的话,要有5组基函数。当然也可以是使用3次样条来解决这个问题,那么需要6个控制点,6 + 3 +1 = 10,也就是说当使用3次样条的话,需要6个基函数。
好了,来一个实例,就能明白怎么使用了,以上的公式了。
均匀B样条:
有4个控制点p1,p2,p3,p4 ,利用3次B样条曲线。进行求解。
采用均匀节点向量 t = [0,1,2,3,4,5,6,7],节点向量个数等于4+3+1共8个。
因为使用的3次B样条,所以最终要求的是
之后我们要依次求零次基函数,一次基函数,二次基函数,三次基函数。 一阶函数
其他的N11,N21,N31,N02,N12,N22,N32,N03,N13,N23,N33。就可以得到3次B样条的表达式。
准均匀B样条:
有4个控制点p1,p2,p3,p4 ,利用3次B样条曲线。进行求解。
采用准均匀节点向量 t = [0,0,0,0,,5,6,7],节点向量个数等于4+3+1共8个。
其他的也是类似的:
其他的N11,N21,N31,N02,N12,N22,N32,N03,N13,N23,N33。就可以得到3次B样条的表达式。
clear all;
close all;
clc;
p =ginput(); %至少点五个点,因为下面有四次样条
plot(p(:,1),p(:,2),'k-o');
%二次均匀b样条
re2=[];
for i=1:length(p)-2
for t=0:0.01:1
b0 = 1/2*(1-t)^2;
b1 = 1/2*(-2*t^2+2*t+1);
b2 = 1/2*t^2;
x=b0*p(i,1)+b1*p(i+1,1)+b2*p(i+2,1);
y=b0*p(i,2)+b1*p(i+1,2)+b2*p(i+2,2);
re2=[re2;x y];
end
end
%三次均匀b样条
re3=[];
for i=1:length(p)-3
for t=0:0.01:1
b0=1/6*(1-t)^3;
b1=1/6*(3.*t^3-6*t^2+4);
b2=1/6*(-3*t^3+3*t^2+3*t+1);
b3=1/6*t^3;
x=b0*p(i,1)+b1*p(i+1,1)+b2*p(i+2,1)+b3*p(i+3,1);
y=b0*p(i,2)+b1*p(i+1,2)+b2*p(i+2,2)+b3*p(i+3,2);
re3=[re3;x y];
end
end
%四次均匀b样条
re4=[];
for i=1:length(p)-4
for t=0:0.01:1
b0=1/24*(t^4-4*t^3+6*t^2-4*t+1);
b1=1/24*(-4*t^4+12*t^3-6*t^2-12*t+11);
b2=1/24*(6*t^4-12*t^3-6*t^2+12*t+11);
b3=1/24*(-4*t^4+4*t^3+6*t^2+4*t+1);
b4=1/24*t^4;
x=b0*p(i,1)+b1*p(i+1,1)+b2*p(i+2,1)+b3*p(i+3,1)+b4*p(i+4,1);
y=b0*p(i,2)+b1*p(i+1,2)+b2*p(i+2,2)+b3*p(i+3,2)+b4*p(i+4,2);
re4=[re4;x y];
end
end
hold on;
plot(re2(:,1),re2(:,2),'r');
plot(re3(:,1),re3(:,2),'g');
plot(re4(:,1),re4(:,2),'b');
同时要保证其在各个连接点保持平滑,那么以二次样条为例:
三次: