Разделение квадрата на прямоугольники случайным образом

Имеется квадрат [8, 8, 0, 0] (ширина, высота, x, y) нужно разделить его на массив прямоугольников случайным образом. Каждый прямоугольник это массив который содержит его размер и его позицию. Делить до тех пор пока ширина либо высота прямоугольника не станет равна единице.


Ответы (1 шт):

Автор решения: MBo

Например, так:

На каждом шаге выбираем случайный прямоугольник из имеющегося активного набора (на первом шаге это исходный квадрат) и ставим точку в случайном месте внутри него.

Случайно выбираем направление разделения от данной точки - по горизонтали или по вертикали, делим прямоугольник на два. Убираем разделённый из активного набора.

Если какой-то из новых имеет размерность 1, кладём его в результат, если нет - в активный набор.

Собственно, выбирать прямоугольник случайным образом необязательно, этот выбор не влияет на распределение, поэтому можно всегда брать любой удобный - первый или последний.

stack.push(square)  
while not stack.empty:
   rect = stack.pop
   pt = randomptinrect(rect)
   dir = randomchoice([vert, hor])
   if dir==vert:
      r1 = rectangle(rect.left, rect.top, pt.x, rect.bottom)
      if (pt.x - rect.left == 1) or (rect.right - pt.x == 1):
          result.push(r1)
      else:
          stack.push(r1)
      c r2 то же
   else:
       с горизонтальным разделением так же
→ Ссылка