MATLAB编程问题,要在一个400*400矩形框里随机的填充圆,要求不能重叠,已知圆的个数N和所有半径Ri。

z=zeros(1,N); %产生一个1*n的数组
A=[b;z;z];%产生一个3*n的数组,第一行是各个圆的半径(已经求出),第二,三行是他的圆心坐标
S=[400,400];
p=rand(1,2).*S;
A(2,1)=p(1);
A(3,1)=p(2);%先随机产生第一个初始坐标
m=1;
isOK=0;
flag=1;
while(flag==1)
u=rand(1,2);
O=S.*u;
for n=1:m
if((O(1)-A(2,n))^2+(O(2)-A(3,n))^2>(A(1,n)+A(1,m+1))^2 )%判断间距
isOK=isOK+1;
end
end

if (isOK==m)
A(2,m+1)=O(1);
A(3,m+1)=O(2);
m=m+1;
isOK=0;
if(m==N)
flag=0;
end
end
end
程序有问题,已知在运行中,没结果!

N=30; %填充30个
b=round(10+20*rand(1,N)); %30个圆半径在10~30之间(这里用随机数产生)
S=[400,400]; %区域大小
%以上是给定的条件,根据你自己的数据给出
%不过根据半径数据的大小,N不能太大
%要不然可能要化很多时间,或者找不到填充位置进入死循环

p=b(1)+(S-2*b(1)).*rand(1,2);%差生一个随机点
A=p'; %第一点坐标记录进矩阵A中
t=0:360;
plot([0 400 400 0 0],[0 0 400 400 0]);hold on %画区域方框
for ii=2:N
    p=b(ii)+(S-2*b(ii)).*rand(1,2);%产生一个新随机点
    while any((A(1,:)-p(1)).^2+(A(2,:)-p(2)).^2<((b(1:ii-1)+b(ii)).^2))
        p=b(ii)+(S-2*b(ii)).*rand(1,2);
    end %根据距离判断新的点是否和所有旧的点距离都满足条件
        %如果有一点不满足条件,重新生成随机点,知道完全满足条件
    A=[A,p']; %保存新的点到矩阵A中
    patch(p(1)+b(ii)*cosd(t),p(2)+b(ii)*sind(t),'r');%填充一个圆
end
hold off
axis equal
axis([-50 450 -50 450]);
A=[b;A];
%最终A是3xN的矩阵,第一行是半径,第二行是x坐标,第三行是y坐标


以下是某次填充的结果

不过这个填充的算法并不健壮,

当圆的半径较大,或者要填的N数目较多时

留下的缝隙太小,以至随机产生的坐标经常失败

甚至很可能留下缝隙不足以再填圆,最终进入死循环


温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-01-10

参考离散元颗粒堆积算法,很多论文参考,算法还是要自己写的,不能偷懒。。

比如二维、三维——指定级配和密度的某个结果

第2个回答  2014-08-11
你需要输出什么结果呢?追问

A,也就是所有圆的坐标

追答

A 有结果啊 我这边就有啊
比如我定义:
b =[ 0.7922 0.9595 0.6557]
z= [0.6787 0.7577 0.7431]
运行得出A=[
0.792207329559554 0.959492426392903 0.655740699156587
318.079960454825 195.905758315292 258.525204044506
74.7490418217514 178.234480284360 283.745932343229
]

追问

我先填充的第一列,其他预致都是0,

追答

不然把你的b和z发过来!

相似回答