Полигональная триангуляция C отверстиями
Я ищу алгоритм или библиотеку (лучше), чтобы разбить многоугольник на треугольники. Я буду использовать эти треугольники в приложении Direct3D. Каковы наилучшие доступные варианты?
вот что я нашел до сих пор:
- Бен Discoe по
- кулак: быстрая промышленная триангуляция полигонов
- Я знаю, что 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, Так что вы можете использовать его в любом проекте.
вы можете добавить отверстия относительно легко самостоятельно. В основном триангулируйте выпуклую оболочку входных точек в соответствии с CGAL, а затем удалите любой треугольник, центр которого находится внутри любого из полигонов отверстий (или вне любой из внешних границ). При работе с большим количеством отверстий в большом наборе данных для значительного ускорения этого процесса могут использоваться методы маскировки.
edit: общим расширением этой техники является прополка слабых треугольников на корпусе, где самый длинный край или самый маленький внутренний угол превышает заданное значение. Это сформирует лучший вогнутый корпус.
Это общая проблема в метод конечных элементов. Это называется "автоматическая генерация сетки". Google нашел этот сайт со ссылками на коммерческих и с открытым исходным кодом. Обычно они предполагают какое-то CAD-представление геометрии для начала.
попробуйте libtess2
https://code.google.com/p/libtess2/downloads/list
на основе оригинального SGI GLU tesselator (с либеральным лицензированием). Решает некоторые проблемы управления памятью вокруг множества небольших mallocs.
другой вариант (с очень гибкой лицензией) - перенести алгоритм из VTK:
этот алгоритм работает довольно хорошо. Использование его напрямую возможно, но требует ссылок на VTK, которые могут иметь больше накладных расходов, чем вы хотите (хотя у него есть много других приятных функций).
Он поддерживает ограничения (отверстия/границы/и т. д.), а также триангуляцию поверхности, которая не обязательно находится в плоскости XY. Это также поддерживает некоторые функции, которые я не видел в другом месте (см. Примечания по Альфа-значениям).
я реализовал 3D полигон триангуляции В C# с помощью метода обрезки ушей. Легко использовать, поддерживает отверстия, численно робастн, и поддерживает aribtrary (не self-intersecting) выпуклые/non-convex полигоны.