%============均匀三次B样条曲线一次微分===========
%输入:
% X: 原始数据点
%输出:
% 均匀三次B样条曲线的一次微分
function [N_Point,CurvPoint] = function_Spline_diff1(X)
[m,n] = size(X); % CSJ: m 为点个数,n 为点维数
%A:方程系数-----------------------------
A=zeros(m+2); % CSJ:为了使曲线通过起始和末端点增加 2 行系数
A(1,1)=-1;A(1,2)=0;A(1,3)=1;
A(m+2,m)=-1;A(m+2,m+1)=0;A(m+2,m+2)=1;
for i=2:(m+1)
A(i,i-1)=1;
A(i,i)=4;
A(i,i+1)=1;
end
%k:方程右边.得到的控制点首尾与插值数据相同.且与控制首末连线相切
e = zeros(m+2,n);
for i=2:m+1
e(i,:)=6*X(i-1,:);
end
%得到 d Boor 控制点
d=inv(A)*e; % A * d =e
%%
%画出图形
uu=(0:0.1:1);
Num = length(uu);
x = zeros(Num,1);
y = zeros(Num,1);
y_diff1 = zeros(Num,1);
y_diff2 = zeros(Num,1);
CurvPoint = [];
Temp_N_Point=size(CurvPoint);
N_Point=Temp_N_Point(1,1); %输出点数
%一次微分作图
for j=1:(m-1) % m个数据点之间有m-1段曲线
for kk=1:Num
x(kk)=d(j,1)*Nfun(0,uu(kk))+d(j+1,1)*Nfun(1,uu(kk))+d(j+2,1)*Nfun(2,uu(kk))+d(j+3,1)*Nfun(3,uu(kk));
y_diff1(kk)=d(j,2)*diff1_Nfun(0,uu(kk))+d(j+1,2)*diff1_Nfun(1,uu(kk))+d(j+2,2)*diff1_Nfun(2,uu(kk))+d(j+3,2)*diff1_Nfun(3,uu(kk));
end
plot(x,y_diff1);
hold on
end
end
%%
%************均匀三次B样条基函数 Nfun.m************
function y = Nfun(i,t)
%参数i,
y=0;
for j=0:(3-i)
y=y+(-1)^j*nchoosek(4,j)*(t+3-i-j)^3;
end
y=y/6;
end
%
%
%基函数一次微分
function y = diff1_Nfun(i,t)
if i==0
y=-0.5*(1-t)^2;
elseif i==1
y=0.5*(3*t^2-4*t);
elseif i==2
y=0.5*(-3*t^2+2*t+1);
elseif i==3
y=0.5*t^2;
end
end