本方法适用于3D点云的凸包的提取,使用python实现。
这里用的方法是对quick hull做了一点小小的改进,主要分为两大块内容,初始化迭代


初始化

构建初始四面体

为了在初始化过程中构建一个相对比较大的四面体,我们需要分别找到6个最值点,分别是XY或者Z轴上的最大或者最小值点。找出6个点中距离最远的两个点,构建一条线。再找出距离这条线最远的点,构建一个面。再找出距离这个面最远的点,构建初始四面体。

外部点分配

在这里,我们将所有点分为两类,即四面体内部点和外部点。内部点由于已经位于凸包内,所以在以后的过程中不予考虑。同时称外部点为激活点。对于每一个激活点,我们把它分配给第一个检测到的,在该点附近的面(可见的面)。这样每一个面就拥有属于自己的一个点集。

初始点、面集

构建初始激活点集,面集。


迭代

检测每一个面的附属点

检测每一个面是否有附属点,如果有的话继续迭代,虽然没有附属点的面不会被压入堆栈

从该面的附属点集中找到最远点

找到最远点可见的所有面

这些可见的面必须是与当前面相邻,在这里这些面被称为light faces。把这些面存储起来,下一步使用。

提取边缘线

显然,从最远点看过去,所有的可见面会构成一个闭合的多边形。这里我们提取这个封闭多边形的边缘线,每一条边和最远点组成新的面。

外部点分配

这一步骤和步骤1.2完全一样,而且同样凸包内部点直接可以忽略。

新的面压入堆栈

没有附属点的面被忽略。


代码

主要代码


Reference

[1] Convex Hull 3D – Quickhull Algorithm
[2] O’Rourke, J. (1998). Computational Geometry in C. Cambridge University Press, UK.
[3] 混合积