不重叠的随机定位圆

Mat*_*lde 5 matlab

我需要随机生成固定数量的非重叠圆。我可以用这段代码随机显示圆圈,在这种情况下是 20 个,

  for i =1:20
  x=0 + (5+5)*rand(1)
  y=0 + (5+5)*rand(1)
  r=0.5
  circle3(x,y,r)
  hold on 
  end
Run Code Online (Sandbox Code Playgroud)

但是圆圈重叠,我想避免这种情况。这是以前使用 Mathematica 的用户实现的https://mathematica.stackexchange.com/questions/69649/generate-nonoverlapping-random-circles,但我正在使用 MATLAB,我想坚持下去。

为了重现性,这是函数,circle3,我用来绘制圆圈

function h = circle3(x,y,r)
 d = r*2;
 px = x-r;
 py = y-r;
 h = rectangle('Position',[px py d d],'Curvature',[1,1]);
 daspect([1,1,1])
Run Code Online (Sandbox Code Playgroud)

谢谢你。

dro*_*rco 2

您可以保存所有先前绘制的圆圈的列表。随机化一个新圆后,检查它是否与之前绘制的圆相交。

代码示例:

nCircles = 20;
circles = zeros(nCircles ,2);
r = 0.5;

for i=1:nCircles
    %Flag which holds true whenever a new circle was found
    newCircleFound = false;
    
    %loop iteration which runs until finding a circle which doesnt intersect with previous ones
    while ~newCircleFound
        x = 0 + (5+5)*rand(1);
        y = 0 + (5+5)*rand(1);
        
        %calculates distances from previous drawn circles
        prevCirclesY = circles(1:i-1,1);
        prevCirclesX = circles(1:i-1,2);
        distFromPrevCircles = ((prevCirclesX-x).^2+(prevCirclesY-y).^2).^0.5;
        
        %if the distance is not to small - adds the new circle to the list
        if i==1 || sum(distFromPrevCircles<=2*r)==0
            newCircleFound = true;
            circles(i,:) = [y x];
            circle3(x,y,r)
        end
    
    end
    hold on
end
Run Code Online (Sandbox Code Playgroud)

*请注意,如果圆圈的数量相对于绘制 x 和 y 坐标的范围来说太大,则循环可能会无限运行。为了避免它 - 相应地定义这个范围(它可以定义为 nCircles 的函数)。

输出示例