Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

alphaShape

依据二维和三维中的点构建的多边形和多面体

说明

alphaShape 创建一个可将一组二维或三维点包围起来的边界面或三维体。您可以操作 alphaShape 对象收紧或放松包括这些点的拟合以创建非凸区域。您还可以添加或删除点,或者隐藏孔或区域。

在创建 alphaShape 对象后,可以执行几何查询。例如,您可以确定某个点是否在形状内,也可以计算构成该形状的区域数。还可以计算一些有用的数量值,例如面积、周长、表面积或体积,以及绘制形状以进行目测。

创建对象

要创建 alphaShape 对象,请使用 alphaShape 函数并利用输入参数定义形状的顶点。您还可以在创建 alphaShape 时指定 alpha 半径以及孔或区域的阈值。

描述

示例

shp = alphaShape(x,y) 使用默认 alpha 半径创建一个包含点 (x,y) 的二维 alpha 形状。默认 alpha 半径将生成最紧凑的拟合 alpha 形状,将所有点包括在内。

shp 表示多边形。多边形没有孤立的点或边,也没有悬边。

示例

shp = alphaShape(x,y,z) 使用默认 alpha 半径创建一个包含点 (x,y,z) 的三维 alpha 形状。

shp 表示多面体。多面体具有如前所述的多边形特性,但它没有孤立的面或悬边。

示例

shp = alphaShape(P) 指定矩阵 P 的各列中的点 (x,y)(x,y,z)

示例

shp = alphaShape(___,a) 使用上述语法中的任何参数创建一个 alpha 半径为 a 的 alpha 形状。

示例

shp = alphaShape(___,Name,Value) 使用一个或多个 Name,Value 对组参数指定的其他选项。例如,您可以使用 'HoleThreshold' 隐藏内部孔或空隙。

输入参数

全部展开

点的 x 坐标,指定为列向量。

数据类型: double

点的 y 坐标,指定为列向量。

数据类型: double

点的 z 坐标,指定为列向量。

数据类型: double

点的坐标,指定为包含两列的矩阵(对于二维 alpha 形状)或包含三列的矩阵(对于三维 alpha 形状)。

  • 对于二维形状,P 的列分别表示 x 坐标和 y 坐标。

  • 对于三维形状,P 的列分别表示 xyz 坐标。

数据类型: double

alpha 半径,指定为非负标量。默认 alpha 半径为 a = criticalAlpha(shp,'all-points'),它是生成包括所有点的 alpha 形状的最小 alpha 半径。

指定 a = criticalAlpha(shp,'one-region') 以使用可以生成只包含一个区域的 alpha 形状的最小 alpha 半径。

a 的极值为

  • Inf,其中 alphaShape 生成凸包。

  • 0,其中 alphaShape 生成一个空的 alpha 形状。

数据类型: double

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: shp = alphaShape(...,'HoleThreshold',10)

要填充的内部孔或空隙的最大面积或体积,指定为有限非负标量。

  • 对于二维形状,HoleThreshold 指定要填充的内孔的最大面积。

  • 对于三维形状,HoleThreshold 指定要填充的内部空隙的最大体积。完全贯穿 alpha 形状的孔不能进行填充。

在指定 'HoleThreshold''RegionThreshold' 时,这些阈值的应用和顺序有关。alphaShape 在隐藏区域之间填充孔。

数据类型: double

要隐藏的区域的最大面积(二维)或体积(三维),指定为有限非负标量。

在指定 'HoleThreshold''RegionThreshold' 时,这些阈值的应用和顺序有关。alphaShape 在隐藏区域之间填充孔。

数据类型: double

属性

全部展开

点的坐标,指定为包含两列或三列数据(对应于二维或三维点集)的矩阵。这些点最初用于创建 alpha 形状,不包含重复项。

数据类型: double

alpha 半径,指定为非负标量。alpha 半径是扫过创建 alpha 形状的所有点的 alpha 圆形或球面的半径。

默认 alpha 半径为 a = criticalAlpha(shp,'all-points'),它是生成包括所有点的 alpha 形状的最小 alpha 半径。指定 a = criticalAlpha(shp,'one-region') 以使用可以生成只包含一个区域的 alpha 形状的最小 alpha 半径。

Alpha 的极值有以下条件:

  • 如果 AlphaInf,则 alphaShape 生成凸包。

  • 如果 Alpha0,则生成的 alphaShape 为空。

数据类型: double

要填充的内部孔或空隙的最大面积或体积,指定为有限非负标量。

  • 对于二维形状,HoleThreshold 指定要填充的内孔的最大面积。

  • 对于三维形状,HoleThreshold 指定要填充的内部空隙的最大体积。完全贯穿三维 alpha 形状的孔不能进行填充。

默认值是 0,这样 alphaShape 不会隐藏任何孔或空隙。HoleThresholdRegionThreshold 属性的应用与顺序有关。alphaShape 会在隐藏区域之前先填充孔。

数据类型: double

要隐藏的区域的最大面积(二维)或体积(三维),指定为有限非负标量。

默认值是 0,这样 alphaShape 不会隐藏任何区域。HoleThresholdRegionThreshold 属性的应用与顺序有关。alphaShape 会在隐藏区域之前先填充孔。

数据类型: double

对象函数

alphaSpectrum提供不同 alpha 形状的 alpha 值
criticalAlpha定义形状中关键变换的 alpha 半径
numRegionsalpha 形状中的区域数
inShape确定点是否在 alpha 形状内部
alphaTriangulation填充 alpha 形状的三角剖分
boundaryFacetsalpha 形状的边界面
perimeter二维 alpha 形状的周长
area二维 alpha 形状的面积
surfaceArea三维 alpha 形状的表面积
volume三维 alpha 形状的体积
plot绘制 alpha 形状
nearestNeighbor确定最近的 alpha 形状边界点

示例

全部折叠

计算二维点数据云的形状。

创建并绘制一个二维点集。

th = (pi/12:pi/12:2*pi)';
x1 = [reshape(cos(th)*(1:5), numel(cos(th)*(1:5)),1); 0];
y1 = [reshape(sin(th)*(1:5), numel(sin(th)*(1:5)),1); 0];
x = [x1; x1+15];
y = [y1; y1];
plot(x,y,'.')
axis equal

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

使用默认 alpha 半径计算点集的 alpha 形状。

shp = alphaShape(x,y);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

检查默认 alpha 半径的值。

shp.Alpha
ans = 0.7752

默认 alpha 半径可生成带不规则边界的 alpha 形状。要更好地捕获点集边界,请尝试更大的 alpha 半径。

使用 alpha 值 2.5 计算 alpha 形状。

shp.Alpha = 2.5;
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

计算三维点数据云的形状。

创建并绘制一个三维点集。

[x1,y1,z1] = sphere(24);
x1 = x1(:);
y1 = y1(:);
z1 = z1(:);
x2 = x1+5;
P = [x1 y1 z1; x2 y1 z1];
P = unique(P,'rows');
plot3(P(:,1),P(:,2),P(:,3),'.')
axis equal
grid on

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

使用 alpha 半径 1 计算三维 alpha 形状。

shp = alphaShape(P(:,1),P(:,2),P(:,3),1);
plot(shp)
axis equal

Figure contains an axes object. The axes object contains an object of type patch.

通过指定 alpha 半径创建一个 alpha 形状,然后填充 alpha 形状内的孔。

创建并绘制一个二维点集。

th = (pi/12:pi/12:2*pi)';
x1 = [reshape(cos(th)*(2:5), numel(cos(th)*(2:5)),1);];
y1 = [reshape(sin(th)*(2:5), numel(sin(th)*(2:5)),1);];
x = [x1; x1+15;];
y = [y1; y1];
plot(x,y,'.')
axis equal

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

使用 alpha 半径 1 计算点集的 alpha 形状。

shp = alphaShape(x,y,1);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

alpha 半径为 1 可生成带有两个包含孔的区域的 alpha 形状。要隐藏 alpha 形状中的小孔,可以通过估计要填充的最大孔的面积来指定 HoleThreshold。要填充形状中的所有孔,可以向 HoleThreshold 分配任意大的值。

通过指定 HoleThreshold 为 15 来新建一个隐藏这些孔的 alpha 形状。

shp = alphaShape(x,y,1,'HoleThreshold',15);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

通过设置区域阈值来控制 alpha 形状的区域数。

创建并绘制一个三维点集。

[x1,y1,z1] = sphere(24);
x1 = x1(:);
y1 = y1(:);
z1 = z1(:);
x2 = x1+5;
[x3,y3,z3] = sphere(5);
x3 = x3(:)+5;
y3 = y3(:);
z3 = z3(:)+25;
P = [x1 y1 z1; x2 y1 z1; 0.25*x3 0.25*y3 0.25*z3];
P = unique(P,'rows');
plot3(P(:,1),P(:,2),P(:,3),'.')
axis equal
grid on

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

使用 alpha 半径 1 计算点集的 alpha 形状。

shp = alphaShape(P,1);
plot(shp)
axis equal

Figure contains an axes object. The axes object contains an object of type patch.

在本例中,alpha 形状在两个同等大小的球面上方产生一个小区域。要隐藏此区域,可通过估计其体积来指定 RegionThreshold

指定 RegionThreshold 为 2。生成的形状仅包含两个较大的区域。

shp.RegionThreshold = 2;
plot(shp)
axis equal

Figure contains an axes object. The axes object contains an object of type patch.

在现有 alpha 形状上添加点。

创建并绘制一个二维点集。

th = (pi/12:pi/12:2*pi)';
x1 = [reshape(cos(th)*(1:5), numel(cos(th)*(1:5)),1); 0];
y1 = [reshape(sin(th)*(1:5), numel(sin(th)*(1:5)),1); 0];
x = [x1; x1+15;];
y = [y1; y1];
plot(x,y,'.')
axis equal

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

使用 alpha 半径 1 计算点集的 alpha 形状。生成的 alpha 形状有两个区域。

shp = alphaShape(x,y,1);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

现在,通过直接向 shp.Points 矩阵添加新点来向 alpha 形状中添加第三个区域。

x3 = x1+8;
y3 = y1+10;
shp.Points(end+1,:) = [x3 y3];
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

扩展功能

版本历史记录

在 R2014b 中推出