Генератор случайных, но правильных многоугольников

Я ищу способ создания набора случайных, но правильных многоугольников внутри данного прямоугольника или сектора круга. Чтобы лучше объяснить, мое заданное 2-мерное пространство должно иметь случайное расположение правильных многоугольников с различным числом сторон, поэтому, например, если два шестиугольника разделены прямоугольником, равным по длине их сторонам, все пространство не может быть заполнено только более шестиугольники, могут потребоваться некоторые треугольники и т. д.

Я ищу один сегмент своего рода эффект калейдоскопа.

11.12.2008 15:14:32
Правильно ли я интерпретирую это, потому что вы не хотите ни перекрытия, ни пустого пространства?
Svante 11.12.2008 15:22:14
@Svante, да, хотя технически последний кусок доступного пустого пространства автоматически сформирует многоугольник.
ProfK 25.01.2011 13:01:37
5 ОТВЕТОВ
РЕШЕНИЕ

Я могу придумать другой подход: сначала определитесь, сколько объектов вы хотите. Скажи "N"

Случайно выберите 3 точки в вашем 2D пространстве.

Используйте 3 очка, чтобы получить виртуальный треугольник.

Теперь выберите другую точку таким образом, чтобы точка находилась за пределами виртуального треугольника. Теперь сформируйте еще один виртуальный треугольник, соединив эту точку с двумя точками предыдущего виртуального треугольника, а затем рекурсивно сформируйте "N" виртуальных треугольников. Если виртуальные треугольники пересеклись, то вы игнорируете большой треугольник и берете треугольники, которые образовались из-за точек пересечения, как новые виртуальные треугольники.

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

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

3
12.12.2008 11:13:00
Первоначально я не хотел пробелов между полигонами, но мне это нравится. Фон может быть хорошим градиентом, текстурой или чем-то еще.
ProfK 17.12.2008 11:47:07

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

  • радиус (от 0 до любого)
  • х и у центра (должны быть в радиусе ребер)
  • количество баллов (от 3 до)
  • вращение (от 0 до 360)

Чтобы предотвратить наложение, вы можете проверить каждый новый многоугольник на каждом существующем многоугольнике и отклонить новый, если расстояние между центрами меньше суммы радиусов.

Рисование полигонов - это простое упражнение триггера.

2
11.12.2008 15:31:54
Да, но чем полнее пространство, тем больше полигонов отбрасывается.
Svante 11.12.2008 15:34:15
Это может быть хорошо - если пространство достаточно заполнено, чтобы (скажем) 20 случайных многоугольников были отклонены, вы можете решить, что пора остановиться.
ShreevatsaR 11.12.2008 17:14:29

Вы ищете алгоритмы листов. Для начала см., Например, страницы Penrose Tiler и Tilings and Tesselations .

3
11.12.2008 16:52:21

Создайте N случайных точек на плоскости и извлеките выпуклую оболочку объекта (то есть, если все многоугольники должны быть выпуклыми).

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

0
12.12.2008 11:22:28
Нет, это НЕ производит правильные многоугольники. Гораздо проще генерировать правильные многоугольники или даже произвольные выпуклые многоугольники напрямую, чем находить выпуклые оболочки. (Не то, чтобы находить выпуклые корпуса слишком сложно, это просто не нужно.)
ShreevatsaR 12.12.2008 11:37:05