正如您可能已经注意到的那样,在较新版本的matlab中 边界函数(计算一组2d或3d点的边界)已得到改进。
现在可以给函数一个名为'shrink factor'的参数。如果收缩因子为0,则跟踪的边界是传统的凸包。当收缩参数更大时,边界更加收缩。如果您未指定任何值,则缩小系数的默认值为0.5。
所以,我理解它的用途及其作用(实际上我已经在项目中使用了该函数),但我不知道它是如何工作的。这种收缩系数的几何原理是什么?
谢谢!
答案 0 :(得分:6)
在自己寻找答案的同时找到了你的问题。希望你现在已经解决了。我已经弄明白了,以防其他人发现这个问题,这是我对boundary()函数的理解。
边界函数是alpha形状的实现。使用alpha形状,可以使用一组特定半径的圆为一组点指定一个多边形: 想象一下围绕这些点绘制的任意形状,并使用特定半径的圆圈尽可能多地去除这种形状。尽可能继续,不包括任何积分。小半径意味着可以移除更多的“材料”,更大的半径意味着更少的“移除”,即小半径产生紧密的裁剪形状,而无限半径重建该组的凸包。然后将确定为边缘点的点与直边连接。这可以在点集内创建空心区域。 参见例如http://doc.cgal.org/latest/Alpha_shapes_2/index.html
MATLAB有一个alphashape()函数,可以计算所有可能的alpha半径的alphashapes,形成不同的形状。这用于边界函数。
boundary()工作流程:
(1)创建alphashape
(2)找到为alpha形状创建单个区域所需的关键alpha半径
(3)提取所有创建超出此临界值的独特形状的alphavalues
(4)使用缩减系数S 选择要使用的单个Alpha值。
示例:,S = 0.25,使用alpha半径索引(1-.25)* numel(alphavalues> = alpha_crit)。这会创建一个alpha形状 使用第75个最小的alpha半径产生单个区域 (对于S = 0.25)。
如果S = 1(最大缩小),则给出给出单个的最低alpha半径 α形区域。
如果S = 0(无收缩),则给出给出唯一的最大alpha半径 形状。 (Incraesing alpha radius进一步没有效果)。
(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
答案 1 :(得分:-1)
YiraDati的回答提供了很多细节。
您也可以在命令窗口中键入“open boundary”,然后所有过程都以边界函数写入。边界函数中显示的所有子函数都可以使用matlab文档访问,如area()
,criticalAlpha()
,alphaSpectrum()
等...