Подтвердить что ты не робот

Упаковка произвольных многоугольников в произвольной границе

Мне было интересно, может ли кто-нибудь указать мне лучший алгоритм/эвристику, которая будет соответствовать моей конкретной проблеме упаковки полигонов. Я получаю один полигон в качестве границы (выпуклый или вогнутый может также содержать дырки), а один "заполняющий" многоугольник (также может быть выпуклым или вогнутым, не содержит отверстий), и мне нужно заполнить граничный многоугольник заданным числом полигонов заполнения. (Я работаю в 2D).

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

  • Начните свой счетчик формы в точке N.
  • Добавьте самую большую "форму упаковки", которую вы можете полностью разместить внутри полигональной границы, не накладывая никаких других форм упаковки.
  • Уменьшите свой счетчик формы.
  • Если ваш счетчик формы > 0, перейдите к шагу 2.

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

EDIT: Шаг 2 сам по себе является трудным. Разумной стратегией было бы выбрать произвольную точку внутри полигона как центр и "раздуть" диск, пока он не коснется границы или другого диска (или обоих), а затем "сдвиньте" диск, продолжая надувать так, чтобы он оставался внутри границы без перекрытия каких-либо других дисков, пока он не "заперт" - по крайней мере с двумя точками контакта с границей и/или с другими дисками. Но формализовать этот "скользящий процесс" непросто. И даже если вы правильно выполняете скользящий процесс, эта стратегия не гарантирует, что вы найдете самый большой "дискриптивный диск" - ваш "локально максимальный" диск может быть захвачен "лепестком" интерьера, который соединен узкой "шеей" свободного пространства до более крупного "лепестка", где будет больший диск.

Ответ 3

Этот тип проблемы очень сложно решать геометрически.

Если вы можете принять хорошее решение вместо 100% оптимального решение, то вы можете решить его с помощью растрового алгоритма.

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

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

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

Ключевыми словами для поиска google являются: растеризация, оверлей, алгоритм

Ответ 4

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

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