3D Convex Hull
本方法适用于3D点云的凸包的提取,使用python实现。
这里用的方法是对quick hull做了一点小小的改进,主要分为两大块内容,初始化
和迭代
。
初始化
构建初始四面体
为了在初始化过程中构建一个相对比较大的四面体,我们需要分别找到6个最值点,分别是X
,Y
或者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] 混合积