使用Matlab在广场内均匀分布相同大小的圆圈

时间:2012-02-03 03:38:26

标签: matlab

我在matlab中绘制了一个尺寸为14 x 14平方的图形,该轴在20 x 20的轴内绘制。 我想在广场内画半径为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

由于

2 个答案:

答案 0 :(得分:5)

随机绘制一切都行不通。实际上,如果你的圈子不能重叠,那么什么都行不通。为了表明这一点,只需比较以下计算的结果:

lSquare = 14;
rCircle = 0.7;
nCircles = 233;
areaCircles = nCircles * pi * rCircle^2
areaSquare = lSquare^2

您会看到areaCircles > areaSquare,因此无法将它们全部放入。另一方面,如果areaSquare >= areaCircles不能保证您的解决方案存在!

尝试使用较小的示例进行设置,以提出解决方案。例如。拿一个方形盒子和一堆球形物体(球,大理石,橙子,苹果......如果需要的话),尽量适合你盒子里的那些。如果可行,您甚至可能希望在尝试实施之前在一张纸上绘制它们的位置。

如果您正确执行此操作,您将了解如何在方形容器中堆叠圆形对象。这也正是您在锻炼中需要做的事情。然后尝试制作手动模型/算法,并在MATLAB中实现。这并不难,但你需要一些小的计算:毕达哥拉斯和圆圈。

我还建议您使用函数绘制一个圆圈,如@Andrey所示,所以形式为function drawCircle(center, radius)。这可以让你降低复杂性。

如果您的圆圈可以重叠,那么解决方案非常简单:将圆圈看作具有中心点的对象,并将这些中心点均匀分布在正方形上。不要使用rand来执行此操作,而是自己计算其位置。

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

答案 1 :(得分:3)

如果没有深入研究代码,我认为您需要在第一个hold之后添加plot函数

 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 函数(比如@EgonGeerardyn建议):

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