Простая двуглавая триангуляция многоугольника

Пытаясь триангулировать набор простых 2d полигонов, я придумал этот алгоритм:

  • 1) Для каждой вершины в многоугольнике вычислим угол между двумя связанными ребрами
  • 2) Сортировка вершин путем уменьшения угла относительно внутренней части многоугольника
  • 3) Если в наборе меньше 3 вершин, мы закончили
  • 4) Возьмите последнюю вершину в множестве и выведите треугольник, образованный им и его двумя соседями
  • 5) Удалите вершину из набора
  • 6) Обновить угол двух соседей
  • 7) Перейти к 2

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

Есть ли угловые случаи, которые будут приводить к вырожденному результату?

Известен ли этот алгоритм?

Если нет, я хотел бы быть уверенным, что этот алгоритм прочен, но у меня нет математического фона, чтобы это доказать.

Большое спасибо.

+9
09 мар. '11 в 15:26
источник поделиться
5 ответов

Вы делаете вариант подхода "уха" к триангуляции, см.: http://en.wikipedia.org/wiki/Polygon_triangulation

Ваш алгоритм терпит неудачу, если другая вершина многоугольника (скажем, с другой стороны многоугольника) окажется внутри треугольника "уха", который вы формируете. Рассмотрим этот пример:

enter image description here

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

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

+6
09 мар. '11 в 15:33
источник

Связанные вопросы


Похожие вопросы

Простые выпуклые многоугольники O (n)

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

Чтобы иметь дело с более сложными многоугольниками, такими как один, который получил Пейн...

complex polygons

Произвольный многоугольник в треугольник в O (n log n)

Хотя существуют алгоритмы, которые работают быстрее, более быстрые алгоритмы становятся очень сложными. Kirkpatrick et al. нашел алгоритм для запуска в O (n log log n) и Chazelle сделал это в O (n). Однако проще всего реализовать алгоритм Seidel, который работает в O (n log n).

Алгоритм представляет собой трехэтапный процесс

  • Разложите многоугольник в трапеции.
  • Разложите трапеции в монотонные полигоны
  • Разложите монотонные многоугольники на треугольники

Источник C

Если вас интересует источник C, его можно получить из Университет Северной Каролины в Чапел-Хилле. В целом качество кода хорошее, обрабатывает отверстия, но, вероятно, нужно будет массировать в соответствии с вашими потребностями.

+3
02 окт. '14 в 9:45
источник

Если я правильно понимаю вас, вы измельчаете треугольники, начиная с самого маленького внутреннего угла. Это может привести к сбою, если многоугольник не выпуклый. Рассмотрим многоугольник с вершинами (по порядку) в точке: (0,0) (10,9) (9,9) (9,10). Наименьший угол - тот, который находится в начале координат, но вы не можете безопасно отрезать этот треугольник.

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

+2
09 мар. '11 в 15:36
источник

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

Алгоритм обрезания уха от libgdx является хорошим местом для начала, поскольку он очень прочен - с использованием FIST (быстрая промышленная прочность триангуляции полигонов).

Я использовал это как основу для тесселяции многоугольника, затем добавил пространственную оптимизацию для тестов "точка-треугольник" (O(n log n) вместо O(n^2)).

Смотрите:


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

+1
02 окт. '16 в 2:59
источник

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

Демо: http://cecchi.me/portfolio/triangulation
Источник: http://cecchi.me/js/point-picking.js.src

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

+1
22 июн. '12 в 15:09
источник

Посмотрите другие вопросы по меткам или Задайте вопрос