📄 bspline_1.m
字号:
function [U,V,R,Info]=BSpline_1(bw,t);
BW=bw;
Info=zeros(10,2);%记录曲线顶点数Info(u,2)为顶点数 ,Info(u,1)为是否有轮廓线的FLAG,1为有,0为没有。。。
U=zeros(10,30);
V=zeros(10,30);
R=zeros(10,30);
Y=zeros(10,10);
X=zeros(10,10);
Z=zeros(10,10);
F=zeros(10,10);
Q=zeros(10,10);
xt=zeros(1,2);
zt=zeros(1,2);
yt=zeros(1,2);
a=0;
b=0;
for i=1:10
for j=1:10
Z(i,j)=0.9-0.2*(i-1);
X(i,j)=-0.9+0.2*(j-1);
Y(i,j)=t*0.5;
end
end
%写坐标矩阵
k=0;
for i=1:10
for j=1:10
if(BW(i,j)==1&F(i,j)==0)
xb=X(i,j);
zb=Z(i,j);
yb=Y(i,j);
Q(i,j)=1;
g=0;
quan=0;
m=i;
n=j;
k=k+1;
h=0;
%找到起点 设起点标志位
Info(k,1)=1;%set the true
while quan==0
while g==0&quan==0
%右扫描
xt(1)=X(i,j);
zt(1)=Z(i,j);
yt(1)=Y(i,j);
if (i~=1&i~=10&j~=10)
%一般情况
if(BW(i-1,j)==1& F(i-1,j)==0)
a=i-1;
b=j;
elseif(BW(i-1,j+1)==1& F(i-1,j+1)==0)
a=i-1;
b=j+1;
elseif(BW(i,j+1)==1& F(i,j+1)==0)
a=i;
b=j+1;
elseif(BW(i+1,j+1)==1&F(i+1,j+1)==0)
a=i+1;
b=j+1;
elseif(BW(i+1,j)==1&F(i+1,j)==0)
a=i+1;
b=j;
else g=1;
end
%一般情况
elseif i==1&j~=10
%特殊情况之一右扫下三点
if(BW(i,j+1)==1& F(i,j+1)==0)
a=i;
b=j+1;
elseif(BW(i+1,j+1)==1&F(i+1,j+1)==0)
a=i+1;
b=j+1;
elseif(BW(i+1,j)==1&F(i+1,j)==0)
a=i+1;
b=j;
else g=1;
end
%右扫下三点结束
elseif i==10&j~=10
%特殊情况之二右扫上三点
if(BW(i-1,j)==1& F(i-1,j)==0)
a=i-1;
b=j;
elseif(BW(i-1,j+1)==1& F(i-1,j+1)==0)
a=i-1;
b=j+1;
elseif(BW(i,j+1)==1& F(i,j+1)==0)
a=i;
b=j+1;
else g=1;
end
%右扫上三点结束
elseif j==10&i~=1&i~=10
%特殊情况之三
if(BW(i-1,j)==1& F(i-1,j)==0)
a=i-1;
b=j;
elseif(BW(i+1,j)==1& F(i+1,j)==0)
a=i+1;
b=j;
else g=1;
%结束
end
elseif j==10&i==1
if(BW(i+1,j)==1& F(i+1,j)==0)
a=i+1;
b=j;
else g=1;
end
elseif j==10&i==10
if(BW(i-1,j)==1& F(i-1,j)==0)
a=i-1;
b=j;
else g=1;
end
end
if(g~=1)
%连线
xt(2)=X(a,b);
zt(2)=Z(a,b);
yt(2)=Y(a,b);
hold on
%plot3(xt,yt,zt,'k');
hold on
i=a;
j=b;
F(i,j)=1;
h=h+1;
U(k,h)=X(i,j);
V(k,h)=Z(i,j);
R(k,h)=Y(i,j);
end
%连线结束
if Q(i,j)==1
quan=1;
Q(i,j)=0;
end
end% 右扫描结束
%判别扫描是否结束
if ((i~=1&i~=10&j~=1)&((BW(i+1,j-1)==1&F(i+1,j-1)==0)|(BW(i,j-1)==1&F(i,j-1)==0)|(BW(i-1,j-1)==1&F(i-1,j-1)==0)))|((i==1&j~=1)&((BW(i+1,j-1)==1&F(i+1,j-1)==0)|(BW(i,j-1)==1&F(i,j-1)==0)))|((i==10&j~=1)&((BW(i,j-1)==1&F(i,j-1)==0)|(BW(i-1,j-1)==1&F(i-1,j-1)==0)))
%左扫描
while(g==1&quan==0)
xt(1)=X(i,j);
zt(1)=Z(i,j);
if (i~=1&i~=10&j~=1)
%一般情况
if(BW(i+1,j)==1&F(i+1,j)==0)
a=i+1;
b=j;
elseif(BW(i+1,j-1)==1&F(i+1,j-1)==0)
a=i+1;
b=j-1;
elseif(BW(i,j-1)==1&F(i,j-1)==0)
a=i;
b=j-1;
elseif(BW(i-1,j-1)==1&F(i-1,j-1)==0)
a=i-1;
b=j-1;
elseif(BW(i-1,j)==1&F(i-1,j)==0)
a=i-1;
b=j;
else g=0;
end
%一般情况
elseif i==1&j~=1
%特殊情况之一左扫下三点
if(BW(i+1,j)==1&F(i+1,j)==0)
a=i+1;
b=j;
elseif(BW(i+1,j-1)==1&F(i+1,j-1)==0)
a=i+1;
b=j-1;
elseif(BW(i,j-1)==1&F(i,j-1)==0)
a=i;
b=j-1;
else g=0;
end
elseif i==10&j~=1
%特殊情况之二左扫上三点
if(BW(i,j-1)==1&F(i,j-1)==0)
a=i;
b=j-1;
elseif(BW(i-1,j-1)==1&F(i-1,j-1)==0)
a=i-1;
b=j-1;
elseif(BW(i-1,j)==1&F(i-1,j)==0)
a=i-1;
b=j;
else g=0;
end
elseif j==1&i~=1&i~=10
%特殊情况之三
if(BW(i-1,j)==1& F(i-1,j)==0)
a=i-1;
b=j;
elseif(BW(i+1,j)==1& F(i+1,j)==0)
b=j;
else g=0;
end
elseif j==1&i==1
if(BW(i+1,j)==1& F(i+1,j)==0)
b=j;
else g=1;
end
elseif j==1&i==10
if(BW(i-1,j)==1& F(i-1,j)==0)
a=i-1;
b=j;
else g=0;
end
%结束
end
% 左扫
if(g~=0)
%连线
xt(2)=X(a,b);
zt(2)=Z(a,b);
yt(2)=Y(a,b);
hold on
%plot3(xt,yt,zt,'k');
hold on
i=a;
j=b;
F(i,j)=1;
h=h+1;
U(k,h)=X(i,j);
V(k,h)=Z(i,j);
R(k,h)=Y(i,j);
if Q(i,j)==1
quan=1;
Q(i,j)=0;
end
end
%连线结束
end
%判别扫描是否结束
if ~(((i~=1&i~=10&j~=10)&((BW(i+1,j+1)==1&F(i+1,j+1)==0)|(BW(i,j+1)==1&F(i,j+1)==0)|(BW(i-1,j+1)==1&F(i-1,j+1)==0)))|((i==1&j~=10)&((BW(i+1,j+1)==1&F(i+1,j+1)==0)|(BW(i,j+1)==1&F(i,j+1)==0)))|((i==10&j~=10)&((BW(i,j+1)==1&F(i,j+1)==0)|(BW(i-1,j+1)==1&F(i-1,j+1)==0))) )
quan=1;
end
else quan=1;
end
end %(quan==0)段程序结束
Info(k,2)=h;
end
end
end
Info
U
V
R
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -