散点轮廓算法——Alpha Shapes

背景

项目原因,需要自动勾勒出一些密集散点的边界,最先想到的是凸包算法,但是明显不符合我的要求,比如我需要求下图(a)中的边界,但是用凸包算法得到的是(b)中的结果,我们理想的结果是(c)中得到的边界,这时候就要寻求另一种算法。
散点轮廓算法——Alpha Shapes_第1张图片
在网上查找的过程中接触了Alpha Shapes的概念,发现正好满足我的要求,在此进行记录:
Alpha Shapes表示一组无序空间点的边界,这个边界不一定是凸的,也不一定是联通的,但是其一定程度上表示了这一组离散点的轮廓。通过调节参数可以使边界更加精细或粗糙。

算法描述

最简单的算法

Alpha Shapes算法思想如下:
(1)设置一个判别半径R(决定了边界的精细程度,越小越精细);
(2)假设数据集有n个无序点,过任意两点P1、P2绘制半径为R的圆(排除两点间距离为2R的情况,显然满足要求的圆通常有两个),如果任意一个圆内没有其他数据点,则认为点P1、P2是边界点,其连线P1P2为边界线段。
(3)n个数据点两两相连共可形成(n*(n-1))/2条线段,逐条进行判断求解。

优化算法

上述的算法时间复杂度明显过高,当数据点数目太多时运算效率很低。我们可以通过设置额外的判别条件加快效率:
(1)当P1P2的长度大于2R时,跳过(一些离群点就可以被排除在外)

最优算法

数据点太多时,简化后的计算量还是较大。为了减少计算量,我们可以先先建立所有散点的Delaunay三角网,再从三角网的外边界开始判断。但是建立Delaunay三角网的算法手动实现有困难,暂且搁置,有待日后再进行优化。。。

你可能感兴趣的:(算法,算法,Alpha,Shapes)