Эффективный алгоритм упаковки неправильных многоугольников

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

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

Это должно выполняться за детерминированное время для неправильных многоугольников с менее чем 100 вершинами.

Цель состоит в том, чтобы произвести «разумную» разбивку неправильного многоугольника для неспециалиста.

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

замещающий текст http://img401.imageshack.us/img401/6551/samplebj.jpg< /а>


person Steve    schedule 21.07.2010    source источник
comment
Ваша диаграмма интересна тем, что это не первый пример «неправильного многоугольника», который приходит на ум. Возможно ли, что полигоны, которые вы и ваши пользователи хотите тесселировать, можно охарактеризовать более узко? Например, стороны параллельны, и, может быть, многоугольники выглядят как утолщенные штрихи? Не могли бы вы привести еще несколько примеров того, что вы ищете?   -  person brainjam    schedule 23.07.2010
comment
Существуют ли какие-либо ограничения на сегменты, составляющие многоугольники? Например, у них всегда есть стороны, ориентированные на кратные X градусов, или углы отклоняются от углов, кратных Y градусам? Я пытаюсь выяснить, можем ли мы иметь точный алгоритм (операции с фиксированной точкой), который не сталкивается с такими проблемами: flixxy.com/geometric-puzzle-solution-i.jpg.   -  person Mau    schedule 23.07.2010


Ответы (2)


Я не знаю, даст ли это оптимальный ответ, но, по крайней мере, даст ответ:

  1. Вычислите триангуляцию Делоне для заданного многоугольника. Для этого существуют стандартные алгоритмы, которые будут работать очень быстро для 100 вершин или менее (см., например, эту библиотеку здесь.) Использование триангуляции Делоне должно гарантировать, что у вас не будет слишком много длинных тонких треугольников.
  2. Разделите любой непрямоугольный треугольник на два прямоугольных, опустив высоту от наибольшего угла к противоположной стороне.
  3. Найдите треугольники, которые можно объединить в прямоугольники: любые два конгруэнтных прямоугольных треугольника (не зеркальные отражения), которые имеют общую гипотенузу. Я подозреваю, что в общем случае их не будет слишком много, если только у вашего неправильного многоугольника не было много прямых углов.

Я понимаю, что нужно заполнить много деталей, но я думаю, что начать с триангуляции Делоне, вероятно, будет правильным решением. Триангуляции Делоне на плоскости можно эффективно вычислить, и они обычно выглядят вполне «естественно».

ОТРЕДАКТИРОВАНО ДЛЯ ДОБАВЛЕНИЯ: поскольку мы находимся в специальной эвристической вилле, в дополнение к жадным алгоритмам, обсуждаемым в других ответах, вы также должны рассмотреть какую-то стратегию «разделяй и властвуй». Если фигура не выпуклая, как в вашем примере, разделите ее на выпуклые формы, многократно разрезая от вершины рефлекса к другой вершине таким образом, чтобы максимально приблизиться к разделению угла рефлекса пополам. После того, как вы разделили фигуру на выпуклые части, я бы подумал о следующем разделении выпуклых частей на части с хорошими «основаниями», части, по крайней мере, с одной стороной, имеющей два острых или прямых угла на концах. Если какой-либо кусок не имеет такой «основы», вы сможете разделить его на две части по диаметру куска и получить две новые части, каждая из которых имеет «основу» (я думаю). Это должно свести проблему к работе с выпуклыми многоугольниками, которые являются своего рода трапецеидальными, и с этого момента жадный алгоритм должен работать хорошо. Я думаю, что этот алгоритм будет разделять исходную форму довольно естественным образом, пока вы не доберетесь до своего рода трапециевидных частей.

person Peter Milley    schedule 22.07.2010
comment
+1 за исчерпывающий ответ. Мой первый обход, это то, что я действительно сделал. К сожалению, поскольку он не предназначен специально для создания прямоугольников, необычно (за исключением особых случаев) найти любую комбинацию этих треугольников, создающих прямоугольник. Пользователи жаловались, что разбивка показалась слишком сложной. И они действительно настаивают на прямоугольниках. - person Steve; 23.07.2010
comment
Похоже, что пользователи толкают эту проблему в область вещей, которые кажутся очень простыми, пока вы не попытаетесь реализовать их. Таких геометрических фигур очень много. - person Peter Milley; 23.07.2010
comment
Определенно! Здесь не поспоришь! - person Steve; 23.07.2010
comment
Звучит неплохо. Однако, как вы можете гарантировать, что вы не объединяете треугольники в слегка шаткие прямоугольники, то есть как вы можете преодолеть числовые ошибки при проверке «прямоугольности»? - person Mau; 23.07.2010
comment
Мау: вероятно, нет хорошего способа предотвратить числовые ошибки, которые вы описываете; Я был бы готов принять погрешность. Я предполагаю, что очень небольшая шаткость была бы приемлемой, если бы это не выглядело слишком плохо визуально, но пользователи Стива будут окончательным судьей об этом. Стив: см. мою правку. - person Peter Milley; 23.07.2010

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

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

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

Отказ от ответственности: я не эксперт в этом, и я даже не пробовал...

person Ken    schedule 22.07.2010
comment
+1 за идею вычитания формы и повторения полученного многоугольника. Может быть расширен до вычитания треугольника и повторения, если обнаружены две параллельные линии, соединенные неперпендикулярной линией (т. Е. Если сумма двух смежных углов составляет 180 градусов) - person Chris Johnson; 23.07.2010
comment
+1 согласился с Крисом. Я думаю о чем-то похожем на вычитание треугольников, но дополненном некоторыми эвристиками, чтобы обрезать прямоугольники. - person Steve; 23.07.2010
comment
Крис: о, отличный вариант для параллельных линий =› еще одна возможность для прямоугольника (с треугольником). - person Ken; 23.07.2010