目录
本文由CSDN点云侠原创,CloudCompare——Delaunay三角剖分,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。
一、常用方法
1.分而治之算法
分而治之算法最早是1975年由Shamos和Hoey提出的,Lewis和Rovinson在1978年利用该方法进行了三角网的剖分,随后Lee和Schachter、Dwyer等对他们的算法进行了改进和优化。
分而治之算法的思路是将复杂问题简单化,首先将数据点分割成包含少量点的子集,如一个子集中包括三个、四个点,然后每个子集进行三角剖分,并用局部优化算法(LOP)进行优化,保证三角剖分为Delaunay三角网,最后是对每个子集的三角剖分进行合并,形成最终的整体三角网。不同的实现方法可有不同的点集划分方法、子网生成方法及合并方法。Lee和Schachter提出了分而治之的经典算法,其基本步骤如下:
- 把点集 V V V以横坐标为主,纵坐标为辅按升序排序,即数据点之间满足条件: ( x i , y i ) < = ( x i + 1 , y i + 1 ) (x_i,y_i)<=(x_{i+1},y_{i+1}) (xi,yi)<=(xi+1,yi+1);
- 把点集 V V V分为近似相等的两个子集 V L V_L VL和 V R V_R VR;
- 在 V L V_L VL和 V R V_R VR中生成三角网;
- 使用局部优化算法,使之成为Delaunay三角网;
- 找出连接 V L V_L VL和 V R V_R VR中两个凸壳的底线和顶线;
- 由底线至顶线合并 V L V_L VL和 V R V_R VR中两个三角网;
- 结束。
该算法的时间复杂度为 ( N l o g N ) (NlogN) (NlogN),其中 N N N为数据点数,因此该算法执行时间效率高,但在 V L V_L VL和 V R V_R VR中生成三角网时,采用了递归运算,需占用较大的系统内存。
2.三角网生长算法
三角网生长算法最早由Green和Sibson在V图中实现,稍后Brassel和Teif也发表了类似的算法。分为收缩生长算法和扩张生长算法,收缩生长算法是先生成凸壳,并以凸壳为源头,逐步缩小以形成整个三角网。收缩生长算法与数据点的分布密度有关,实际情况比较复杂。扩张生成算法与收缩算法过程刚好相反,算法是从一个三角形开始向外层扩展,最终形成覆盖整个区域的三角网,是常用的三角网生长算法。
扩张生长算法的思想是先找出点集中最近两点连接成一条边,按照Delaunay三角网构成原则找出第三点,将这三点连接成初始三角形,再以该三角形的每一条边为基线扩展连接相邻离散点,组成新三角形,初始三角形的三边处理之后,继续以新三角形的边连接其他离散点,直到所有的离散点均包含在三角网中。该算法的基本步骤:
- 在区域内所有离散点任取一点作为初始三角形的第一个顶点;
- 找距离第一个顶点最近的点,作为初始三角形的第二个顶点,两点相连生成初始基线;
- 找出距离初始基线中点最近且不和已有两点在一条直线上的点作为初始三角形的第三个顶点,三点连接成三角形,即为初始三角形;
- 三角形的两条新边作为新的基线;
- 重复步骤3、4直到所有基线处理完毕。
该算法的时间复杂度在一般情况下为 O ( N 3 / 2 ) O(N^{3/2}) O(N3/2),最坏情况下达到 O ( N 2 ) O(N^2) O(N2)。因此该算法的时间效率低,优点是占用内存空间较小。在该算法的基础上有许多的改进算法,其改进点主要集中在“第三点”的搜索和三角形重复的判断上。
3.逐点插入算法
逐点插入算法的思想最早由Lawson(1977)提出,随后Lee和Schachter(1980)、Bowyer(1981)、Watson(1981)、Tsai(1993)等先后对其进行改进,是一种动态的构网方式。
逐点插入算法的思路是将未处理的点加入到己经存在的Delaunay三角网中,然后判断点所在的三角形,如果点在三角形内,连接点与三角形的各顶点,利用三角剖分准则,找出影响区域,删除影响区域中的边,对影响区域利用三角剖分准则重新构网,直到区域中所有的点都加入到三角网中。该算法的基本步骤如下:
- 首先定义一个包含所有数据点的初始多边形,即包含所有数据点的凸闭包;
- 在凸闭包中构建初始Delaunay三角网;
- 从内部数据点中取出一点加入到三角网中;
- 搜寻包含该点的三角形,将该点与此三角形的三个顶点相连,形成三个三角形;
- 利用Delaunay三角网的剖分准则,找出影响区域,从里到外更新所有生成的三角形;
- 重复步骤3、4、5直到处理完点集中所有点。
该算法一般情况下时间复杂度为
O
(
N
3
/
2
)
O(N^{3/2})
O(N3/2),最坏情况下达到
O
(
N
2
)
O(N^2)
O(N2)。该算法的时间效率低,优点是算法思路较简单,占用内存空间较小,空间性能较好。
通常,分而治之算法的效率是最高的,但是当数据量比较大,分块比较多时,块之间的合并算法复杂,且花时也多,并且递归执行,内存消耗大;三角网生长算法和逐点插入法的执行效率差不多,但是在构网的过程中逐点插入法能保持较好的空间特性。
二、软件操作
1.Delaunay 2.5D(XY plane)
通过菜单栏的'Edit > Mesh > Delaunay 2.5D (XY plane)'
找到该功能。
其实现流程为:
- 点云简单地在XY平面上进行2D投影。
- 对相应的2D点进行三角剖分。
- 将网格结构应用于3D点。
默认情况下,2D Delaunay三角剖分是在点云凸包上完成。因此,CloudCompare将要求用户指定三角形边的最大长度(如下图所示)。这允许移除不一定有意义的最大三角形(通常在边界上)。如果该值保持为零,则会保留Delaunay三角剖分输出的所有三角形。
这适用于表面较为平坦和具有适当定向(即Z维度为垂直的)的点云。如果点云没有正确定向但在某个方向上仍然相当平坦,则应考虑使用此方法的另一个版本'Mesh> Delaunay 2.5D(best fitting plane)
。
以下是某道路机载点云的Delaunay 2.5D模型生成结果
CloudCompare默认以面片的形式
显示mesh网格模型,因此放大之后也看不到所谓的“网格”
在属性选项中,选中以线的形式
显示格网,即可清楚看到Delaunay三角网的网形状,操作如下:
Delaunay三角网的构网形状如下:
此外,还有以点的形式
显示模型。
以点的形式显示结果如下,可以看出,路面起伏特征及模型的纹理细节更加清晰。所以Delaunay 算法也是可以用于地面滤波与变化监测的???
2.Delaunay 2.5D(XY best fitting plane)
该方法与 Delaunay 2.5D (XY plane)功能基本相同。
其实现流程为:
- 点云投影在最小二乘拟合的最佳平面。
- 对相应的2D点进行三角剖分。
- 将网格结构应用于3D点。
其他操作与Delaunay 2.5D相同。