равномерно распределить круги одинакового размера внутри квадрата с помощью Matlab - PullRequest
2 голосов
/ 03 февраля 2012

У меня есть фигура размером 14 х 14, нарисованная внутри оси 20 х 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 ]

5 голосов
/ 03 февраля 2012

Случайное построение графика не сработает. На самом деле, если ваши круги не могут перекрываться, ничего не будет работать. Чтобы показать это, сравните результаты следующих расчетов:

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 для этого, но рассчитайте их позиции самостоятельно.

Если вы не можете найти решение, я могу расширить свой ответ через несколько дней.

3 голосов
/ 03 февраля 2012

Не вдаваясь слишком глубоко в ваш код, я думаю, что вам нужно добавить функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...