您可能已经注意到,在较新版本的matlab中,边界函数(计算一组2d或3d点的边界)已得到改进.
现在可以给函数一个名为'shrink factor'的参数.如果收缩因子为0,则跟踪的边界是传统的凸包.当收缩参数更大时,边界更加收缩.如果未指定任何值,则缩小系数的默认值为0.5.
所以,我理解它的用途和它的作用(实际上我已经在项目中使用过该函数),但我不知道它是如何工作的.这种收缩系数的几何原理是什么?
谢谢!
小智 7
在找到答案的同时找到了你的问题.希望你现在已经解决了.我已经弄明白了,以防其他人发现这个问题,这是我对boundary()函数的理解.
边界函数是alpha形状的实现.使用alpha形状,可以使用一组特定半径的圆来为一组点指定一组多边形:想象围绕这些点绘制的任意形状,然后使用特定半径的圆尽可能多地移除此形状.尽可能继续,不包括任何积分.小半径意味着可以移除更多的"材料",更大的半径意味着更少的"移除",即小半径产生紧密的裁剪形状,而无限半径重建该组的凸包.然后将确定为边缘点的点与直边连接.这可以在点集内创建空心区域.参见例如http://doc.cgal.org/latest/Alpha_shapes_2/index.html
MATLAB有一个alphashape()函数,可以计算所有可能的alpha半径给出不同形状的alpha形状.这用于边界函数.
boundary()工作流程:
(1)创建alphashape
(2)找到为alpha形状创建单个区域所需的关键alpha半径
(3)提取所有在该临界值之上创建独特形状的alphavalues
(4)使用收缩因子S选择要使用的单个alpha值.
示例:使用S = 0.25,使用alpha radius和index(1-.25)*numel(alphavalues> = alpha_crit).这将使用第75个最小的alpha半径创建一个alpha形状,从而产生单个区域(对于S = 0.25).
如果S = 1(最大收缩),则给出最小的alpha半径,为alpha形状提供单个区域.
如果S = 0(无收缩),则给出提供唯一形状的最大alpha半径.(Incraesing alpha radius进一步没有影响).
(5)设置填充alpha形状的孔的阈值与alpha形的区域相同,即填入所有孔
(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
Run Code Online (Sandbox Code Playgroud)
希望这对某人来说足够清楚和有用.
我使用MATLAB R2014b
| 归档时间: |
|
| 查看次数: |
2291 次 |
| 最近记录: |