Предполагая, что вы рисуете эллипсы в растровом графическом изображении, вы можете рассчитать пиксели, которые вы должны будете нарисовать для эллипса, проверить, все ли эти пиксели в изображении по-прежнему имеют цвет фона, и нарисовать эллипс, только если ответ - да, в противном случае отклоните его (потому что что-то другое, то есть другой эллипс, мешает) и попробуйте другие x
, y
, a
и b
.
В качестве альтернативы, вы можете разбить изображение на прямоугольники (необязательно одинакового размера) и поместить один эллипс в каждый из них, выбрав x, y, a, b так, чтобы ни один эллипс не превышал его прямоугольник - тогда эллипсы не могут перекрываться либо , но это зависит от того, сколько "случайности" должно иметь ваше размещение эллипса, достаточно ли этого.
Математически строгим способом было бы хранить x, y, a, b каждого нарисованного эллипса и для каждого нового эллипса делать попарные проверки с каждым из них, имеют ли они общие точки, решая систему из двух квадратных уравнений. Однако это может быть немного сложным, особенно если угол не равен 0.
Редактировать в ответ на добавленный код : Вместо того, чтобы фиксировать все x
и y
перед циклом, вы можете определить их внутри цикла. Так как вы знаете, сколько эллипсов вы хотите, но не столько, сколько вам нужно для выборки, вам необходим цикл while
. Тестовый цикл, который вы даете, может пригодиться, но вам нужно сравнить все предыдущие эллипсы с тем, который был создан в итерации цикла, а не с первым.
i=1;
while (i<=4) %# or length(a), or, more elegantly, some pre-defined max
x(i) = rand*400; y(i) = rand*400; %# or take x and y as givren and decrease a and b
%# now, check overlap for given center
overlap = false;
for k=1:(i-1)
overlap = overlap || overlap_ellipses(x(i),y(i),a(i),b(i),angle(i),x(k),y(k),a(k),b(k),angle(k))
end
if (~overlap)
img = drawellipse(x(i),y(i),a(i),b(i),angle(i),steps,color,img);
i = i+1; %# determine next ellipse
end %# else x(i) and y(i) will be overwritten in next while loop iteration
end
Конечно, если фиксированы a
и b
, может случиться так, что ни один эллипс не будет соответствовать размерам изображения, если, к сожалению, уже размещены уже существующие, что приведет к бесконечному циклу.
Что касается вашего плана оставить центр неподвижным и уменьшать размер эллипса до тех пор, пока он не будет соответствовать: откуда взялся ваш метод overlap_ellipses
? Может быть, его можно адаптировать, чтобы он возвращал коэффициент, на который один эллипс нужно сжать, чтобы он соответствовал другому (и 1, если он уже подходит)?