B样条基函数的递推定义:
根据B样条的递推定义有,在任意给定的节点区间内[ui,ui+1)内,最多由p+1个基函数不为零,它们分别为Ni-p,p …Ni,p
计算节点区间内所有不为零的基函数分为两步:
1、计算节点区间下标
2、计算不为零基函数
%% 计算节点区间下标
function index=FindSpan(n,p,u,U)
%n 为节点区间i的最大值,n=基函数个数=控制点个数
%p 为曲线的次数
%U 为节点矢量
if u==U(n+1)
index=n;
return;
end
low=p;
high=n+1;
mid=fix((low+high)/2);
while u<U(mid)||u>=U(mid+1)
if u<U(mid)
high=mid;
else
low=mid;
end
mid=fix((low+high)/2);
end
index=mid;
end
%% 计算节点区间内所有不为零的基函数
function N=BasisFuns(i,u,p,U)
%i为节点区间下标,u为节点值,p为曲线次数,U为节点向量
N=zeros(1,p+1);
N(1,1)=1;
for j=1:p
save=0.0;
r=0;
t=0;
while r<j
r=r+1;
temp=N(1,r)/(R(i,t+1,u,U)+L(i,j-t,u,U));
N®=save+R(i,t+1,u,U)*temp;
save=L(i,j-t,u,U)*temp;
t=t+1;
end
N(:,j+1)=save;
end
end
% 定义嵌套函数L R
function Li=L(i,l,u,U)
Li=u-U(i-l+1);
end
function Ri=R(i,l,u,U)
Ri=U(i+l)-u;
end
验证代码:
%计算节点区间
clear;
U=[0 0 0 1 2 3 4 4 5 5 5];
p=2;
n=length(U)-p-1;
u=3.5;
x=FindSpan(n,p,u,U);
disp(BasisFuns(x,u,p,U));
结果:0.1250 0.6250 0.2500