仅以此记录一下花了一点时间找的五次B样条规划的计算公式
1、三次计算公式
F:-(t - 1)^3/6
F:t^3/2 - t^2 + 2/3
F:(t + 1)^3/6 - (2*t^3)/3
F:t^3/6
2、四次计算公式
F:(t - 1)^4/24
F:t^3/2 - t^2/4 - t/2 - t^4/6 + 11/24
F:(t + 2)^4/24 - (5*(t + 1)^4)/24 + (5t^4)/12
F:(t + 1)^4/24 - (5t^4)/24
F:t^4/24
3、五次计算公式
F(0):-(t - 1)^5/120
F(1):t^2/6 - (5*t)/12 + t^3/6 - t^4/6 + t^5/24 + 13/60
F(2):t^4/4 - t^2/2 - t^5/12 + 11/20
F(3):(t + 2)^5/120 - (t + 1)^5/20 + t^5/8
F(4):(t + 1)^5/120 - t^5/20
F(5):t^5/120
此部分代码参考:https://www.cnblogs.com/tiandsp/p/12232392.html
clear all;
close all;
clc;
p =ginput(); %至少点五个点,因为下面有四次样条(鼠标在figure上点,最后点完之后按enter显示刚刚的点)
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');