Функция, которую вы хотите использовать: DelaunayTri
, и вы должны выполнить следующие шаги:
- Создать список точек ребра в вашем многоугольнике.
- Возьмите все точки вершин вашего многоугольника и объедините их с дополнительными фиксированными точками, которые вы хотите включить в многоугольник.
- Создайте ограниченную триангуляцию (как я показал в других ответах) здесь и здесь ).
- Как вы заметили, это создаст триангуляцию выпуклой оболочки (даже если у вас есть вогнутый многоугольник), поэтому вы должны иметьудалить треугольники за пределами ограниченных ребер, используя метод
inOutStatus
(также проиллюстрирован в ответах, связанных выше).
Вот пример кода:
polygonVertices = [0 0;... %# Concave polygon vertices
0 1;...
1 1;...
0.5 0.5;...
1 0];
polygonEdges = [1 2;... %# Polygon edges (indices of connected vertices)
2 3;...
3 4;...
4 5;...
5 1];
otherVertices = [0.5.*rand(5,1) rand(5,1)]; %# Additional vertices to be added
%# inside the polygon
vertices = [polygonVertices; otherVertices]; %# Collect all the vertices
dt = DelaunayTri(vertices,polygonEdges); %# Create a constrained triangulation
isInside = inOutStatus(dt); %# Find the indices of inside triangles
faces = dt(isInside,:); %# Get the face indices of the inside triangles
И теперь переменные faces
и vertices
могут использоваться для построения сетки с многоугольниками .
Работа с более старыми версиями MATLAB...
Просмотр архивной версии документаmentation ( примечание: для этого требуется учетная запись MathWorks), видно, что DelaunayTri
впервые появился в версии 7.8.0 (2009a).До этого единственная встроенная функциональность, доступная для выполнения двумерной триангуляции Делоне, была delaunay
, которая была основана на Qhull и, таким образом, была неспособна поддерживать ограниченные триангуляции или триангуляцииневыпуклых поверхностей.
Более новые DelaunayTri
используют CGAL .Таким образом, один из вариантов для пользователей версий старше 7.8.0 - создавать MEX-файлы для взаимодействия подпрограмм CGAL в MATLAB.Например, если вы столкнулись с триангуляцией вогнутого многоугольника, вы можете создать MEX-файл для сопряжения с одной из процедур выпуклого разбиения в CGAL , чтобы разбить вогнутый многоугольник на набор выпуклых многоугольников.,Затем delaunay
можно использовать для триангуляции каждого выпуклого многоугольника, а окончательный набор триангуляций сгруппировать в одну большую триангуляцию вогнутого многоугольника.