使用 convhull 和 convhulln 计算凸包
convhull 和 convhulln 函数取一个点集,输出位于凸包边界上的点的索引。凸包基于点索引的表示法支持绘图,且便于数据访问。下面这些示例说明凸包的计算和表示方式。
第一个示例使用 seamount 数据集的一个二维点集作为 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 可以计算二维和三维点集的凸包。可以重复使用海底山数据集说明三维凸包的计算。
包含海底山 z 坐标数据仰角。
close(gcf)
K = convhull(x,y,z);
在三维空间中,凸包的边界 K 由三角剖分表示。这是以矩阵格式表示的一组三角面,并有关于点数组的索引。矩阵 K 的每一行表示一个三角形。
由于凸包的边界表示为三角剖分,因此可以使用三角剖分绘图函数 trisurf。
trisurf(K,x,y,z,'Facecolor','cyan')
三维凸包约束的体积可由 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 维,但是由于内存需求迅猛增长,对高于十维情况下出现的问题难以应对。
convhull 函数在二维和三维情况下优于 convhulln,因为它更稳定,表现出更佳的性能。