2012-02-03 2 views
1

У меня есть фигура размером 14 x 14 квадратов, нарисованная внутри оси 20 x 20, в матрице. Я пытаюсь нарисовать круги радиуса 0.7 внутри квадрата и их равномерно распределить. Мне нужно нарисовать 233 круга. Пожалуйста, дайте мне знать, как я могу это сделать? В настоящее время я могу нарисовать их случайным образом, но не смог получить 233 круга. См. Мой код ниже. Ваш ответ приветствуется.равномерно распределяют круги одинакового размера внутри квадрата с помощью Matlab

% 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 

Благодаря

+1

Возможно, стоит сделать некоторые математические исследования. [kepler conjecture] [1] содержит несколько хороших глав о таких проблемах. [1] [http://www.amazon.com/Keplers-Conjecture-Greatest-History-Problems/dp/0471086010] – bdecaf

ответ

4

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

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

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

+0

Спасибо Эгон. Я попробую и вернусь, если я не смогу получить требуемый ответ. – user679460

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 
+0

Спасибо. Но проблема в том, что мне нужно добавить 233 круга постоянного размера, распределяющих их равномерно внутри квадрата размером 14 x 14? – user679460

+0

@ Andrey .. извините, я уже принял! – user679460

+0

@ user679460, вы должны принять гораздо больше вопросов из своего прошлого.Особенно в вопросах, которые вы прокомментировали: «Отличный ответ! Именно то, что я хотел». - http://stackoverflow.com/questions/5457125/reading-index-value-of-a-table-row-with-many-cells-and-reading-the-value-from-it –

Смежные вопросы