使用Matlab在正方形内均匀分布相同大小的圆

使用Matlab在正方形内均匀分布相同大小的圆,matlab,Matlab,我有一个大小为14x14平方的图形,画在一个20x20的轴内,在matlab中。 我试图在正方形内画半径为0.7的圆,需要均匀地排列它们。我需要画233个圆圈。请告诉我怎么做? 目前我可以随机抽取,但无法得到233圈。请看我下面的代码。 谢谢你的答复 % Urban, sub urban, Rural areas x_area =[3, 12, 6]; y_area = [6, 8, 16]; r_area = [1, 7, 2]; f =

我有一个大小为14x14平方的图形,画在一个20x20的轴内,在matlab中。 我试图在正方形内画半径为0.7的圆,需要均匀地排列它们。我需要画233个圆圈。请告诉我怎么做? 目前我可以随机抽取,但无法得到233圈。请看我下面的代码。 谢谢你的答复

% Urban, sub urban, Rural areas
      x_area =[3, 12, 6];
      y_area = [6, 8, 16];
      r_area = [1, 7, 2];


       f = figure;
       hAxs = axes('Parent',f);
        hold on, box on, axis equal
        xlabel('x')
        ylabel('y','Rotation',0)
        title('Compute the area of circles a vectorized way for several cicles')
        axis([0 20 0 20])
        rectangle('Position',[5,1,14,14])
         rectangle('Position',[3,1,2,2])
        rectangle('Position',[1,3,4,4])
         hold on, box on, axis equal


      a = 233;
      x_base_urban = randi([6 18], 1, a);
       b = rand([10 8], 1);
       y_base_urban = randi([2 14],1, a);
       r_base_urban = 0.9;


        size_x = size(x_base_urban);
        size_x = size_x(2);
        size_y = size(y_base_urban);
         size_y = size_y(2);

        colour = rand(size_x,3);
       for t = 1: size_x
         plot(x_base_urban(t)+ r_base_urban.*cos(0:2*pi/100:2*pi),...
        y_base_urban(t)+ r_base_urban.*sin(0:2*pi/100:2*pi),'parent',hAxs)
         plot(x_base_urban(t),y_base_urban(t),'+','parent',hAxs)

         end

谢谢

在不深入代码的情况下,我认为您需要在第一个
绘图之后添加一个
hold
函数

 for t = 1: size_x
     plot(x_base_urban(t)+ r_base_urban.*cos(0:2*pi/100:2*pi),...
     y_base_urban(t)+ r_base_urban.*sin(0:2*pi/100:2*pi),'parent',hAxs)
     plot(x_base_urban(t),y_base_urban(t),'+','parent',hAxs)
     hold(hAxs,'on');
 end
顺便说一下,画圆的最好方法是使用
rectangle
命令

 rectangle('Curvature',[1 1],'Position',[1 3 4 5])
因此,您可以创建一个PlotCircle函数(如@egongereardyn所建议的),如下所示:

 function plotCircle(x,y,r)
      rectangle('Position',[x-r y-r 2*r 2*r],'Curvature',[1 1]);
 end

随机绘制所有内容是行不通的。事实上,如果你的圆不能重叠,什么都不起作用。为了说明这一点,只需比较以下计算结果:

lSquare = 14;
rCircle = 0.7;
nCircles = 233;
areaCircles = nCircles * pi * rCircle^2
areaSquare = lSquare^2
您将看到
areaCircles>areaSquare
,因此不可能将它们全部放入。另一方面,如果
areaSquare>=areaCircles
不能保证存在解决方案

请用一个较小的示例尝试您的设置,以找到解决方案。例如,拿一个正方形的盒子和一堆球形物体(球、大理石、桔子、苹果等,如果需要的话),尽量把它们放在盒子里。如果这样做有效,您甚至可能希望在尝试实施之前在一张纸上画出他们的位置

如果操作正确,您将了解如何在方形容器中堆叠圆形对象。这也正是你在运动中需要做的。然后试着为你手工做的事情建立一个模型/算法,并在MATLAB中实现。这并不难,但你需要一些小的计算:毕达哥拉斯和圆的交点

我还建议您使用一个函数来绘制一个圆,如@Andrey所示,因此可以采用
函数drawCircle(中心,半径)
的形式。这使您能够降低复杂性

如果圆可以重叠,那么解决方法很简单:将圆视为具有中心点的对象,并将这些中心点均匀分布在正方形上。不要使用
rand
来进行此操作,而是自己计算他们的位置


如果您找不到解决方案,我可能会在几天后扩展我的答案。

谢谢。但问题是,我需要添加233个大小不变的圆圈,将它们均匀分布在一个大小为14 x 14的正方形中?@user679460,你应该接受你过去提出的更多问题。特别是在你评论的问题上——“完美的答案!正是我想要的。”-也许值得做一些数学研究。[开普勒猜想][1]有一些关于这些问题的好章节。[1] [谢谢Egon。如果我不能给出所需的答案,我会尝试并回来。