[求助] 死循环问题
单步走,不报错,可是一直接运行就死循环,恳请高手帮忙看看!可能是两个子函数有问题,他们的终止条件是不是有问题?
function myconvexhull
clear all
clc
hold on
L_x=20;L_y=20;a_min=1;a_max=2;
S_min=4;S_max=10;
Area_all=0; % 生成的所有凸多边形的总面积
MYAREA=[]; % 存储每个凸多边形的面积
n=0;
x0=[];y0=[];
theta0=[];
tic
warning off MATLAB:divideByZero
while Area_all<=0.2.*L_x.*L_y
n=n+1;
x=[];y=[];R=[];
U1=rand;
S(n)=fix(U1*(S_max-S_min)+S_min);
U2=rand;
x0(n)=U2*(L_x-a_max)+1;
U3=rand;
y0(n)=U3*(L_y-a_max)+1;
U4=rand;
theta0(n)=U4*2*pi;
for i=1:S(n)
U5=rand;
R(i)=U5*(a_max/2-a_min/2)+a_min/2; %vector radius
x(i)=x0(n)+R(i).*cos(theta0(n)+(i-1).*2.*pi/S(n));
y(i)=y0(n)+R(i).*sin(theta0(n)+(i-1).*2.*pi/S(n));
end
%避免畸形(狭长)
C=[];
for i=1:length(x)
eval(['A_x' num2str(i) '=repmat(x(i),1,length(x)-1)']);
eval(['A_y' num2str(i) '=repmat(y(i),1,length(x)-1)']);
j=find(x~=x(i));
eval(['B_x' num2str(i) '=x(j)']);eval(['B_y' num2str(i) '=y(j)']);
a=(eval(['A_x' num2str(i)])-eval(['B_x' num2str(i)]));
b=(eval(['A_y' num2str(i)])-eval(['B_y' num2str(i)]));
c=sqrt(a.^2+b.^2);
c=max(c);
C=;
end
Mymaxdistance(n)=max(C(:)); %第n个多边形的最大直径
Mymindistance(n)=min(C(:)); %第n个多边形的最小直径
if Mymaxdistance(n)>2.*Mymindistance(n)
n=n-1;
continue
end
% 得到二维凸壳
=convhull(x,y);
x=x(ii);y=y(ii);
S(n)=length(x);
x=;y=;
MYAREA=;% 前n个凸多边形的面积
B{1,n}=;
R=R(ii);R=;
%-----------------------------
% 重叠判断
if n==1
plot(x,y)
axis()
end
if n>1
N=myoverlapping_determination(B,x,y,n)
if N~=n
continue
end
end
%-------------
% 侵入判断
if n==1
plot(x,y)
axis()
end
if n>1
M=myoverlay_determination(B,x,y,n)
if M~=n
continue
end
end
%---------------
% 面积率判断
Area_all=sum(MYAREA);
if Area_all>0.2.*L_x.*L_y
break
end
% 防止死循环
if n>100
disp('Maybe there is something wrong about this programm.')
lasterr
lastwarn
return
end
end
toc
%--------------
function N=myoverlapping_determination(B,x,y,n)
for i=1:n-1
XYi1=[];xi1=[];yi1=[];
XYi1=B{1,i};
xi1=XYi1(:,1)';yi1=XYi1(:,2)';
in=inpolygon(xi1,yi1,x,y)
if all(in==0)
plot(x,y)
axis()
N=n;
return
else
n=n-1;
N=n;
return
end
end
%--------------
function M=myoverlay_determintation(B,x,y,n)
nn=n;
k_n=[];
for i=1:length(x)-1
k_n(i)=(y(i+1)-y(i))./(x(i+1)-x(i));
end
a1=k_n;b1=repmat(-1,1,length(a1));
c1=k_n.*x(1:end-1)-y(1:end-1);
for i=1:n-1
%XYi2=[];xi2=[];yi2=[];
XYi2=B{1,i};
xi2=XYi2(:,1)';yi2=XYi2(:,2)';
k_i=[];
for j=1:length(xi2)-1
k_i(j)=(yi2(j+1)-yi2(j))./(xi2(j+1)-xi2(j));
end
a2=k_i;b2=repmat(-1,1,length(a2));
c2=k_i.*xi2(1:end-1)-yi2(1:end-1);
for k=1:length(x)-1
for l=1:length(xi2)-1
A1=;
B1=;
myintersection=A1\B1;
if isempty(myintersection)==0
n=n-1;
M=n;
return
else
plot(x,y)
axis()
M=n;
return
end
end
end
end
[ 本帖最后由 eight 于 2007-5-26 12:32 编辑 ] 原帖由 canglang 于 2007-5-25 17:04 发表 http://www.chinavib.com/forum/images/common/back.gif
单步走,不报错,可是一直接运行就死循环,快疯掉了!恳请高手帮忙看看!
迫于无奈直接贴代码,这种感觉很郁闷!!!快崩溃啦!
你说这种话别人更加不愿意帮你,你想想,你的任务自己都做得疯掉、崩溃了,别人还敢往你的问题钻?有点主见的人肯定靠边站拉
建议自己手动调试一下,每个人都不可能一次性地把代码做好,这就需要调试
[ 本帖最后由 eight 于 2007-5-25 17:13 编辑 ] 可能是 函数myoverlapping_determination 出问题
建议检查一下 to eight兄:
"提醒“的对,下次我再也不这样问啦!:lol
先前没写过程序,这学期摸着石头过河!
只是想请帮忙看看是不是有什么明显的错误,也许自己没看出来!尤其是两个子函数的跳出问题!孤军奋战,没有人请教或讨论呀!
to yimao兄:
myoverlapping_determination ? 你是指哪里?再试试,非常感谢!
[ 本帖最后由 canglang 于 2007-5-25 17:52 编辑 ]
回复 #2 eight 的帖子
对于直接贴代码让人效劳,我深恶痛绝!但是自己。。。!问题已于昨晚找到,解决中。
恳请斑竹删除此贴!更是谢谢高手们的关注! 原帖由 canglang 于 2007-5-26 12:30 发表 http://www.chinavib.com/forum/images/common/back.gif
对于直接贴代码让人效劳,我深恶痛绝!但是自己。。。!
问题已于昨晚找到,解决中。
恳请斑竹删除此贴!更是谢谢高手们的关注!
删除倒不必,下次注意就是了。另外我重新编辑了一下你的原帖
回复 #6 eight 的帖子
非常感谢! 原帖由 canglang 于 2007-5-25 17:37 发表 http://www.chinavib.com/forum/images/common/back.gifto eight兄:
"提醒“的对,下次我再也不这样问啦!:lol
先前没写过程序,这学期摸着石头过河!
只是想请帮忙看看是不是有什么明显的错误,也许自己没看出来!尤其是两个子函数的跳出问题!孤军奋战,没 ...
myoverlay_determintation(B,x,y,n)
这个子函数 我想是你自己编的吧?可能有点问题,你自己再看看,我又看不到你的这个函数 原帖由 yimao 于 2007-5-26 15:22 发表 http://www.chinavib.com/forum/images/common/back.gif
myoverlay_determintation(B,x,y,n)
这个子函数 我想是你自己编的吧?可能有点问题,你自己再看看,我又看不到你的这个函数
十分感谢你的关注。这个函数我贴在最下面呀!(两个子函数都附在代码的后面!) 已解决,谢谢各位高手的关注!
上面那段代码错误不少哦!进行了很大改动!
[ 本帖最后由 canglang 于 2007-6-4 12:14 编辑 ]
页:
[1]