声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2656|回复: 9

[编程技巧] [求助] 死循环问题

[复制链接]
发表于 2007-5-25 17:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

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

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=[C,c];
  end
    Mymaxdistance(n)=max(C(:));       %第n个多边形的最大直径
    Mymindistance(n)=min(C(:));       %第n个多边形的最小直径
    if Mymaxdistance(n)>2.*Mymindistance(n)
       n=n-1;
       continue
    end
%   得到二维凸壳
    [ii,AREA_n]=convhull(x,y);
    x=x(ii);y=y(ii);
    S(n)=length(x);
    x=[x,x(1)];y=[y,y(1)];      
    MYAREA=[MYAREA,AREA_n];  % 前n个凸多边形的面积
    B{1,n}=[x',y'];
    R=R(ii);R=[R,R(1)];
%-----------------------------
%   重叠判断
   if n==1
      plot(x,y)
      axis([0 20 0 20])
   end
   if n>1
      N=myoverlapping_determination(B,x,y,n)
      if N~=n
        continue
      end
   end
%-------------
%   侵入判断
    if n==1
       plot(x,y)
       axis([0 20 0 20])
   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([0 20 0 20])
       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=[a1(k),b1(k);a2(l),b2(l)];
            B1=[c1(k);c2(l)];
            myintersection=A1\B1;
            if isempty(myintersection)==0
               n=n-1;
               M=n;
               return

            else
                plot(x,y)
               axis([0 20 0 20])

               M=n;
               return
            end
         end
     end
end

[ 本帖最后由 eight 于 2007-5-26 12:32 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-5-25 17:07 | 显示全部楼层
原帖由 canglang 于 2007-5-25 17:04 发表
单步走,不报错,可是一直接运行就死循环,快疯掉了!恳请高手帮忙看看!
迫于无奈直接贴代码,这种感觉很郁闷!!!快崩溃啦!


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

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

[ 本帖最后由 eight 于 2007-5-25 17:13 编辑 ]
发表于 2007-5-25 17:09 | 显示全部楼层
可能是 函数myoverlapping_determination 出问题
建议检查一下
 楼主| 发表于 2007-5-25 17:37 | 显示全部楼层
to eight兄:
"提醒“的对,下次我再也不这样问啦!:lol

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

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

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

[ 本帖最后由 canglang 于 2007-5-25 17:52 编辑 ]
 楼主| 发表于 2007-5-26 12:30 | 显示全部楼层

回复 #2 eight 的帖子

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

恳请斑竹删除此贴!更是谢谢高手们的关注!
发表于 2007-5-26 12:32 | 显示全部楼层
原帖由 canglang 于 2007-5-26 12:30 发表
对于直接贴代码让人效劳,我深恶痛绝!但是自己。。。!
问题已于昨晚找到,解决中。

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



删除倒不必,下次注意就是了。另外我重新编辑了一下你的原帖
 楼主| 发表于 2007-5-26 12:34 | 显示全部楼层

回复 #6 eight 的帖子

非常感谢!
发表于 2007-5-26 15:22 | 显示全部楼层
原帖由 canglang 于 2007-5-25 17:37 发表
to eight兄:
"提醒“的对,下次我再也不这样问啦!:lol

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

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



myoverlay_determintation(B,x,y,n)
这个子函数 我想是你自己编的吧?可能有点问题,你自己再看看,我又看不到你的这个函数
 楼主| 发表于 2007-5-26 18:58 | 显示全部楼层
原帖由 yimao 于 2007-5-26 15:22 发表



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




十分感谢你的关注。这个函数我贴在最下面呀!(两个子函数都附在代码的后面!)
 楼主| 发表于 2007-6-4 12:02 | 显示全部楼层
已解决,谢谢各位高手的关注!

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

[ 本帖最后由 canglang 于 2007-6-4 12:14 编辑 ]
convex polygon11.jpg
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-12 16:01 , Processed in 0.069337 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表