По заданному полигону и точкам фиксации найдите треугольные сетки - PullRequest
5 голосов
/ 27 декабря 2010

Допустим, у меня есть многоугольник, и я хочу его объединить.Чтобы дополнительно наложить ограничения на полученную сетку, я предоставлю список точек фиксации (которые должны находиться внутри многоугольника), чтобы они были соединены сгенерированными элементами треугольника.приказ сделать это?Я пробовал команду delaunay, но она не работает на вогнутом многоугольнике, потому что команда delaunay всегда возвращает мне список элементов, которые охватывают выпуклую область.

1 Ответ

5 голосов
/ 27 декабря 2010

Функция, которую вы хотите использовать: 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 можно использовать для триангуляции каждого выпуклого многоугольника, а окончательный набор триангуляций сгруппировать в одну большую триангуляцию вогнутого многоугольника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...