случайное размещение прямоугольников без наложений - PullRequest
1 голос
/ 08 марта 2012

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

Я вижу два способа сделать это:

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

  2. использовать сетку и размещать прямоугольники в ячейках случайным образом.Это все еще может выглядеть как размещение сетки.Мне тоже это не нравится.

есть ли лучшие способы сделать это?«лучше» означает более эффективный или более визуально «случайный», чем сеточный подход.лучше в любом отношении.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2012

Вот простая эвристика. Это будет непересекающимся и случайным.

Разместите прямоугольник случайным образом. Затем вычислите пересечения расширений двух параллельных ребер первого прямоугольника с ребрами холста. Вы получите четыре выпуклые пустые области. Разместите другие прямоугольники в этих пустых областях по одному независимо и рассчитайте аналогичные деления для мест размещения. И попробуйте поместить оставшиеся прямоугольники в пустые регионы.

Вы можете попробовать разные стратегии. Вы можете попытаться поместить прямоугольники близко к углам. Или вы можете разместить их вокруг центра регионов. Мы не можем обсуждать оптимальность, потому что вы ввели случайность.

0 голосов
/ 19 февраля 2017

Я создаю внутренние комнаты, похожие на подземелья, используя следующий метод.

1) Разбросать N точек случайным образом, но не в нескольких пикселях друг от друга. 2) Для каждой точки по очереди расширьте, если это возможно, во всех четырех направлениях. прекращение расширяется, если вы нажмете другой прямоугольник. 3) Прекратите алгоритм, когда комнаты не могут расширяться.

В результате получается N прямоугольников с небольшим количеством прямоугольников.

Код находится в библиотеке двоичных изображений

https://github.com/MalcolmMcLean/binaryimagelibrary/blob/master/dungeongenerator3.c #

0 голосов
/ 08 марта 2012

Вы можете найти Quadtrees или R-деревья полезными для вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...