% u:节点值
% n:节点向量长度
% p:p次
% U:节点向量
% P:控制点
% d:维数
function s=BSplinePoint(u,n,p,U,P,d)
x=FindSpan(n,p,u,U);
B=BasisFuns(x,u,p,U);
s(d)=0;
for k=0:d-1
for j=0:p
s(k+1) = s(k+1) + P(k * n + x - p + j)*B(j+1);
end
end
end
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(1,r)=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
function Ri=R(i,l,u,U)
Ri=U(i+l)-u;
end
% 定义嵌套函数L R
function Li=L(i,l,u,U)
Li=u-U(i-l+1);
end``
B样条曲线函数
于 2023-08-02 21:37:24 首次发布