Эффективный алгоритм упаковки для правильных многоугольников - PullRequest
7 голосов
/ 21 июля 2010

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

Если возможно, ответ на этот вопрос должен объяснить общую эвристику, используемую в предлагаемом алгоритме.

Ответы [ 3 ]

8 голосов
/ 21 июля 2010

Я думаю, что ответ довольно прост для обычных полигонов.

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

https://content.screencast.com/users/Tom/folders/Jing/media/04cb9283-7fc0-4ccd-99ad-a4e056f81b23/2010-06-21_0056.png

0 голосов
/ 21 июля 2010

Вы можете попробовать "вырезать" самый большой прямоугольник, который может поместиться в многоугольник , оставив после себя некоторые остатки. Продолжайте повторять вырезание прямоугольников на остатках, пока не получите треугольные кусочки. Затем вы можете разделить их на два прямоугольных треугольника, если это необходимо. Я не знаю, всегда ли это даст решения, которые дадут вам наименьшее количество прямоугольников и прямоугольных треугольников.

0 голосов
/ 21 июля 2010

Это не конкретно прямоугольники + прямоугольные треугольники, но хорошая точка исследования для изучения многоугольников тесселяции: Диаграммы Вороного и триангуляции Делоне и здесь и здесь .

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

Вы также можете попробовать обрезание уха , либо проведя радиально,если вы знаете, что у вас достаточно правильные многоугольники или «обрезка самого большого выпуклого фрагмента».Затем разделите каждый оставшийся треугольник на два, чтобы создать прямоугольные треугольники.

полигон http://static.eruciform.com/images/polygon.png

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

Однако иногда это создает очень тонкие треугольники.Вы можете выполнить эвристику, например, «взять самое большое», вместо того, чтобы непрерывно обрезать по краю, но это занимает больше времени, приближаясь к O (n ^ 2).Делоне / Ворной в большинстве случаев делают это быстрее, с менее тонкими треугольниками.

...