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

Я ищу алгоритм или библиотеку (лучше), чтобы разбить многоугольник на треугольники. Я буду использовать эти треугольники в приложении Direct3D. Каковы наилучшие доступные варианты?

вот что я нашел до сих пор:

  1. Бен Discoe по
  2. кулак: быстрая промышленная триангуляция полигонов
  3. Я знаю, что CGAL обеспечивает триангуляцию, но не уверен, что это поддерживает отверстия.

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

Edit: это 2D-полигон.

9 ответов


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


чтобы дать вам еще несколько вариантов библиотек:

Polyboolean. Я никогда не пробовал этот, но он выглядит многообещающим:http://www.complex-a5.ru/polyboolean/index.html

Общий Полигон "Клипер". Это работает очень хорошо на практике и делает триангуляцию, а также вырезание и отверстия отверстия:http://www.cs.man.ac.uk / ~toby / alan / программное обеспечение/

моя личная рекомендация: используйте тесселацию из GLU (OpenGL Служебная Библиотека). Код является твердым камнем, быстрее, чем GPC, и генерирует меньше треугольников. Вам не нужен инициализированный OpenGL-дескриптор или что-то подобное, чтобы использовать lib.

Если вам не нравится идея включить системные библиотеки OpenGL в приложение DirectX, также есть решение: просто загрузите ссылочный код реализации SGI OpenGL и поднимите триангулятор из него. Он просто использует имена OpenGL-Typedef и руку, полную перечислений. Вот и все. Вы можете извлечь код и через час или два сделайте самостоятельный Либ.


В общем, мой совет-использовать то, что работает, и не начинать писать свою собственную триангуляцию.

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

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


CGAL имеет инструмент, который вам нужен: Триангуляции

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

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


Я обнаружил, что библиотека poly2tri-это именно то, что мне нужно для триангуляции. Он создает гораздо более чистую сетку, чем другие библиотеки, которые я пробовал (включая libtess), и он также поддерживает отверстия. Он был преобразован в кучу языков. Лицензия новый BSD, Так что вы можете использовать его в любом проекте.

библиотека Poly2tri в коде Google


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

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


Это общая проблема в метод конечных элементов. Это называется "автоматическая генерация сетки". Google нашел этот сайт со ссылками на коммерческих и с открытым исходным кодом. Обычно они предполагают какое-то CAD-представление геометрии для начала.


попробуйте libtess2

https://code.google.com/p/libtess2/downloads/list

на основе оригинального SGI GLU tesselator (с либеральным лицензированием). Решает некоторые проблемы управления памятью вокруг множества небольших mallocs.


другой вариант (с очень гибкой лицензией) - перенести алгоритм из VTK:

vtkDelaunay2D

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

Он поддерживает ограничения (отверстия/границы/и т. д.), а также триангуляцию поверхности, которая не обязательно находится в плоскости XY. Это также поддерживает некоторые функции, которые я не видел в другом месте (см. Примечания по Альфа-значениям).


я реализовал 3D полигон триангуляции В C# с помощью метода обрезки ушей. Легко использовать, поддерживает отверстия, численно робастн, и поддерживает aribtrary (не self-intersecting) выпуклые/non-convex полигоны.