【发布时间】:2015-10-28 11:27:04
【问题描述】:
您可能已经注意到,在较新版本的 matlab 中, 边界函数(计算一组 2d 或 3d 点的边界)已得到改进。
现在可以给函数一个称为“收缩因子”的参数。如果收缩因子为 0,则跟踪的边界是传统的凸包。收缩参数越大,边界越收缩。收缩系数的默认值为 0.5,以防您不指定任何值。
所以,我了解它的用途和作用(实际上我已经在项目中使用过该功能),但我不知道它是如何工作的。这个收缩系数的几何原理是什么?
谢谢!
【问题讨论】:
您可能已经注意到,在较新版本的 matlab 中, 边界函数(计算一组 2d 或 3d 点的边界)已得到改进。
现在可以给函数一个称为“收缩因子”的参数。如果收缩因子为 0,则跟踪的边界是传统的凸包。收缩参数越大,边界越收缩。收缩系数的默认值为 0.5,以防您不指定任何值。
所以,我了解它的用途和作用(实际上我已经在项目中使用过该功能),但我不知道它是如何工作的。这个收缩系数的几何原理是什么?
谢谢!
【问题讨论】:
在自己寻找答案时发现了您的问题。希望你现在已经解决了。我已经想通了,万一其他人发现这个问题,这是我对边界()函数的理解。
边界函数是 alpha 形状的实现。使用 alpha 形状,可以通过使用一组具有特定半径的圆为一组点分配一个多边形: 想象一个围绕点绘制的任意形状,然后使用特定半径的圆尽可能多地删除该形状。尽可能长时间地继续,不要封闭任何点。小半径意味着可以移除更多的“材料”,更大的半径意味着更少的“移除”,即小半径创建紧密裁剪的形状,而无限半径重新创建集合的凸包。然后将确定为边缘点的点与直边相连接。这可以在点集内创建空心区域。 参见例如http://doc.cgal.org/latest/Alpha_shapes_2/index.html
MATLAB 有一个 alphashape() 函数,它计算 alphashapes,所有可能的 alpha 半径给出不同的形状。这是在边界函数中使用的。
boundary() 工作流程:
(1) 创建 alphashape
(2) 找到关键的 alpha 半径,需要为 alpha 形状创建单个区域
(3) 提取所有在此临界值之上创建独特形状的 alpha 值
(4) 使用 收缩因子 S 选择要使用的单个 alpha 值。
示例: S=0.25,使用索引为 (1-.25)*numel(alphavalues>=alpha_crit) 的 alpha 半径。这将创建一个 alpha 形状 使用第 75 个最小的 alpha 半径产生单个区域 (对于 S = 0.25)。
如果 S=1(最大收缩),则给出最小的 alpha 半径 alpha 形状的区域。
如果 S=0(不收缩),给出唯一的最大 alpha 半径 形状。 (进一步增加 alpha 半径没有效果)。
(5)将alphashape中空洞的填充阈值设置为与alphashape的面积相同,即填满所有空洞
(6) 返回原始点云对应于这个 alphashape 顶点的索引。
boundary.m 文件的相关部分(第 79-86 行)
Acrit = shp.criticalAlpha('one-region'); %alpha-radius required for single region
spec = shp.alphaSpectrum();%all alphavalues
idx = find(spec==Acrit);
subspec = spec(1:idx);%alphavalues up to criticalAlpha
subspec = flipud(subspec);%reverse order
idx = max(ceil((1-S)*numel(subspec)),1); %find index from shrink factor
alphaval = subspec(idx);
shp.Alpha = alphaval; %set alpha value of alpha shape
shp.HoleThreshold = areavol; % remove holes in interior
希望这对某人来说足够清楚和有用。
我使用 MATLAB R2014b
【讨论】:
YiraDati 的回答提供了很多细节。
你也可以在命令窗口中输入“开放边界”,然后所有的程序都写在边界函数中。并且边界函数中显示的所有子函数都可以使用 matlab 文档访问,例如area()、criticalAlpha()、alphaSpectrum() 等...
【讨论】: