最近遇到一个求二维点集凹包的问题,凹包的叫法不知道是否准确,问题可以描述为:(原文下载在文章末尾)
在二维平面上有一系列的点,求能包围所有点集的二维多边形。(好像搜“离散点边界”或“点云边界提取”比凹包更准确)
这个很容易想起二维凸包问题,目前已经有很多算法实现点集的凸包,凸包:https://en.wikipedia.org/wiki/Convex_hull ,这里不再赘述。
主要介绍二维点集凹包的一些算法,这里只做大致介绍,不做详细叙述。
通过网上查找资料,网址http://www.tuicool.com/articles/iUvMjm
介绍了计算凹包的3中方法,且在github上有源码下载链接,感兴趣的可以下载测试。
基于Delaunay三角化,如左图,先将所有的点进行Delaunay三角化,然后删掉太长的边得到点集的凹包。
滚边法(Edge Pivoting),先找到一个凸点作为起始点,一般取y最小的点,顺时针查询距离其几何距离在R内的所有点,即求所谓的 R邻域 ,对R邻域的点集进行排序,再在领域中一个点作为连接点,再以此点作为起始点求R邻域。但是这个算法作者实现的并不是很稳定,总是出现一条单边,而不是多边形,但是还是要感谢作者无私奉献源码。