canglang 发表于 2007-5-25 17:04

[求助] 死循环问题

单步走,不报错,可是一直接运行就死循环,恳请高手帮忙看看!

可能是两个子函数有问题,他们的终止条件是不是有问题?

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 编辑 ]

eight 发表于 2007-5-25 17:07

原帖由 canglang 于 2007-5-25 17:04 发表 http://www.chinavib.com/forum/images/common/back.gif
单步走,不报错,可是一直接运行就死循环,快疯掉了!恳请高手帮忙看看!
迫于无奈直接贴代码,这种感觉很郁闷!!!快崩溃啦!


你说这种话别人更加不愿意帮你,你想想,你的任务自己都做得疯掉、崩溃了,别人还敢往你的问题钻?有点主见的人肯定靠边站拉

建议自己手动调试一下,每个人都不可能一次性地把代码做好,这就需要调试

[ 本帖最后由 eight 于 2007-5-25 17:13 编辑 ]

yimao 发表于 2007-5-25 17:09

可能是 函数myoverlapping_determination 出问题
建议检查一下

canglang 发表于 2007-5-25 17:37

to eight兄:
"提醒“的对,下次我再也不这样问啦!:lol

先前没写过程序,这学期摸着石头过河!

只是想请帮忙看看是不是有什么明显的错误,也许自己没看出来!尤其是两个子函数的跳出问题!孤军奋战,没有人请教或讨论呀!

to yimao兄:
myoverlapping_determination ? 你是指哪里?再试试,非常感谢!

[ 本帖最后由 canglang 于 2007-5-25 17:52 编辑 ]

canglang 发表于 2007-5-26 12:30

回复 #2 eight 的帖子

对于直接贴代码让人效劳,我深恶痛绝!但是自己。。。!
问题已于昨晚找到,解决中。

恳请斑竹删除此贴!更是谢谢高手们的关注!

eight 发表于 2007-5-26 12:32

原帖由 canglang 于 2007-5-26 12:30 发表 http://www.chinavib.com/forum/images/common/back.gif
对于直接贴代码让人效劳,我深恶痛绝!但是自己。。。!
问题已于昨晚找到,解决中。

恳请斑竹删除此贴!更是谢谢高手们的关注!


删除倒不必,下次注意就是了。另外我重新编辑了一下你的原帖

canglang 发表于 2007-5-26 12:34

回复 #6 eight 的帖子

非常感谢!

yimao 发表于 2007-5-26 15:22

原帖由 canglang 于 2007-5-25 17:37 发表 http://www.chinavib.com/forum/images/common/back.gif
to eight兄:
"提醒“的对,下次我再也不这样问啦!:lol

先前没写过程序,这学期摸着石头过河!

只是想请帮忙看看是不是有什么明显的错误,也许自己没看出来!尤其是两个子函数的跳出问题!孤军奋战,没 ...


myoverlay_determintation(B,x,y,n)
这个子函数 我想是你自己编的吧?可能有点问题,你自己再看看,我又看不到你的这个函数

canglang 发表于 2007-5-26 18:58

原帖由 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:02

已解决,谢谢各位高手的关注!

上面那段代码错误不少哦!进行了很大改动!

[ 本帖最后由 canglang 于 2007-6-4 12:14 编辑 ]
页: [1]
查看完整版本: [求助] 死循环问题