MATLAB® обеспечивает несколько способов вычислить выпуклую оболочку:
Используя convexHull
метод предоставлен delaunayTriangulation
класс
Используя alphaShape
функция с альфа-радиусом Inf
.
convhull
функционируйте поддерживает расчет выпуклых оболочек в 2D и 3-D. convhulln
функционируйте поддерживает расчет выпуклых оболочек в N-D (N ≥ 2). convhull
функция рекомендуется для 2D или 3-D расчетов из-за лучшей робастности и эффективности.
delaunayTriangulation
класс поддерживает 2D или 3-D расчет выпуклой оболочки от Триангуляции Делоне. Этот расчет не так эффективен как специализированное convhull
и convhulln
функции. Однако, если у вас есть delaunayTriangulation
из набора точки и требуют выпуклой оболочки, convexHull
метод может вычислить выпуклую оболочку более эффективно из существующей триангуляции.
alphaShape
функционируйте также поддерживает 2D или 3-D расчет выпуклой оболочки путем установки альфа-входного параметра радиуса на Inf
. Как delaunayTriangulation
, однако, вычисляя использование выпуклой оболочки alphaShape
менее эффективно, чем использование convhull
или convhulln
непосредственно. Исключение - когда вы работаете с ранее созданным альфа-объектом фигуры.
convhull
и convhulln
функции берут набор точек и выводят индексы точек, которые лежат на контуре выпуклой оболочки. Точка основанное на индексе представление графического вывода поддержек выпуклой оболочки и удобного доступа к данным. Следующие примеры иллюстрируют расчет и представление выпуклой оболочки.
Первый пример использует 2D набор точки от набора данных подводной горы, как введено к функции convhull.
Загрузите данные.
load seamount
Вычислите выпуклую оболочку набора точки.
K = convhull(x,y);
K
представляет индексы точек, расположенных в против часовой стрелки цикл вокруг выпуклой оболочки.
Отобразите на графике данные и его выпуклую оболочку.
plot(x,y,'.','markersize',12) xlabel('Longitude') ylabel('Latitude') hold on plot(x(K),y(K),'r')
Добавьте метки точки в точки на выпуклой оболочке, чтобы наблюдать структуру K
.
[K,A] = convhull(x,y);
convhull
может вычислить выпуклую оболочку и 2D и 3-D наборов точки. Можно снова использовать набор данных подводной горы, чтобы проиллюстрировать расчет 3-D выпуклой оболочки.
Включайте вертикальные изменения данных z-координаты подводной горы.
close(gcf) K = convhull(x,y,z);
В 3-D контур выпуклой оболочки, K
, представлен триангуляцией. Это - набор треугольных фасетов в матричном формате, который индексируется относительно массива точки. Каждая строка матричного K
представляет треугольник.
Поскольку контур выпуклой оболочки представлен как триангуляция, можно использовать функцию построения графика триангуляции trisurf
.
trisurf(K,x,y,z,'Facecolor','cyan')
Объем, ограниченный 3-D выпуклой оболочкой, может опционально быть возвращен convhull
, синтаксис следующие.
[K,V] = convhull(x,y,z);
convhull
функция также предоставляет возможность упрощения представления выпуклой оболочки путем удаления вершин, которые не способствуют области или объему. Например, если граничные фасеты выпуклой оболочки являются коллинеарными или компланарными, можно объединить их, чтобы дать более краткое представление. Следующий пример иллюстрирует использование этой опции.
[x,y,z] = meshgrid(-2:1:2,-2:1:2,-2:1:2); x = x(:); y = y(:); z = z(:); K1 = convhull(x,y,z); subplot(1,2,1) defaultFaceColor = [0.6875 0.8750 0.8984]; trisurf(K1,x,y,z,'Facecolor',defaultFaceColor) axis equal title(sprintf('Convex hull with simplify\nset to false')) K2 = convhull(x,y,z,'simplify',true); subplot(1,2,2) trisurf(K2,x,y,z,'Facecolor',defaultFaceColor) axis equal title(sprintf('Convex hull with simplify\nset to true'))
MATLAB обеспечивает convhulln
функционируйте, чтобы поддержать расчет выпуклых оболочек и гиперобъемов в более высоких размерностях. Хотя convhulln
поддержки N-D, проблемы больше чем в 10 размерностях представляют собой проблемы из-за быстро растущих требований к памяти.
convhull
функция превосходит convhulln
в 2D и 3-D, когда это более устойчиво и дает лучшую эффективность.
Этот пример показывает отношение между Триангуляцией Делоне набора точек в 2D и выпуклой оболочкой того набора точек.
delaunayTriangulation
класс поддерживает расчет Триангуляций Делоне в 2D и трехмерном пространстве. Этот класс также обеспечивает convexHull
метод, чтобы вывести выпуклую оболочку из триангуляции.
Создайте Триангуляцию Делоне набора точек в 2D.
X = [-1.5 3.2; 1.8 3.3; -3.7 1.5; -1.5 1.3; 0.8 1.2; ... 3.3 1.5; -4.0 -1.0; -2.3 -0.7; 0 -0.5; 2.0 -1.5; ... 3.7 -0.8; -3.5 -2.9; -0.9 -3.9; 2.0 -3.5; 3.5 -2.25]; dt = delaunayTriangulation(X);
Постройте триангуляцию и подсветите ребра, которые совместно используются только одним треугольником, показывает выпуклую оболочку.
triplot(dt) fe = freeBoundary(dt)'; hold on plot(X(fe,1), X(fe,2), '-r', 'LineWidth',2) hold off
В 3-D фасеты триангуляции, которые совместно используются только одним четырехгранником, представляют контур выпуклой оболочки.
Специализированный convhull
функция обычно более эффективна, чем расчет на основе convexHull
метод. Однако основанный на триангуляции подход является соответствующим если:
У вас есть delaunayTriangulation
из набора точки уже и выпуклой оболочки также требуется.
Вы должны добавить или удалить точки из набора инкрементно и должны часто повторно вычислять выпуклую оболочку после того, как вы отредактировали точки.
В этом примере показано, как вычислить выпуклую оболочку 2D набора точки с помощью alphaShape
функция.
alphaShape
вычисляет упорядоченную альфа-форму из набора 2D или 3-D точек. Можно задать альфа-радиус, который определяет, как плотно или свободно альфа-форма окутывает набор точки. Когда альфа-радиус установлен в Inf
, получившаяся альфа-форма является выпуклой оболочкой набора точки.
Создайте набор 2D точек.
X = [-1.5 3.2; 1.8 3.3; -3.7 1.5; -1.5 1.3; 0.8 1.2; ... 3.3 1.5; -4.0 -1.0; -2.3 -0.7; 0 -0.5; 2.0 -1.5; ... 3.7 -0.8; -3.5 -2.9; -0.9 -3.9; 2.0 -3.5; 3.5 -2.25];
Вычислите и постройте выпуклую оболочку набора точки с помощью альфа-формы с альфа-радиусом, равным Inf
.
shp = alphaShape(X,Inf); plot(shp)
convhull
| convhulln
| convexHull
| delaunayTriangulation
| alphaShape