PCL Delaunay贪婪投影三角化(Surface_GreedyProjectionTriangulation)

PCL专栏目录及须知

用于无序点云的三角剖分,点云最好经过体素抽稀,保证点云平滑,且密度相差不大。

目录

1.Delaunay三角剖分

1.1 空圆性质

1.2 Delaunay三角剖分

1.2.1 概念

1.2.2 性质

1.2.3 算法流程

2. 使用场景

3. 关键函数

4.完整代码

5.结果展示


1.Delaunay三角剖分

1.1 空圆性质

即一个三角形(或边)的外接圆范围内(边界除外),不包含点集P中的任何顶点。

如下图:

黑色点为点集P。圆形为三角形的外接圆。图左,三角形的外接圆内部包含点集P中的其他顶点(不符合空圆性质);图右,两个三角形外接圆的内部都不包含点集P中的其他顶点(符合空圆性质);

1.2 Delaunay三角剖分

1.2.1 概念

所有三角形的外接圆均满足空圆性质的三角剖分,称为一个Delaunay三角剖分。

(1)Delaunay三角形:外接圆满足空圆性质的三角形。

(2)Delaunay边:外接圆满足空圆性质的三角形的其中一条边。

(3)局部Delaunay边:对三角剖分中的一条属于两个三角形的边e,若存在一个外接圆不包含三角形中的任何顶点称为局部Delaunay边。若一条边只属于一个三角形,也属于局部Delaunay边。Delaunay边一定是局部Delaunay的,但反过来未必。

(4)边翻转:对于点集的三角剖分并不唯一,例如下图:

图左图右是一个点集的不同三角剖分,两条红线代表不同的剖分方法。

如上面不唯一的剖分所示,从左边的竖着的那条红色的内对角线变成右边横着的内对角线的这个操作称作边翻转。每进行一次边翻转就会得到一个不同的剖分方案。

通过边翻转,实现不同的剖分方案,以得到满足空圆性质的Delaunay三角形

1.2.2 性质

三角剖分得到的三角形,满足以下几个性质:

(1)空圆性

三角剖分后的所有三角面片都必须满足空圆性。

(2)最邻近性

任何一条连接于最邻近两点之间的边,都会创造出一个Delaunay三角形,也即必有一个外接圆满足该性质。<

### CGAL 和 PCLDelaunay 三角剖分教程 #### 使用 CGAL 进行 Delaunay 三角剖分 CGAL 提供了一个强大的几何算法库,其中包括用于二维和三维 Delaunay 三角剖分的功能。下面是一个简单的 C++ 示例程序,展示如何使用 CGAL 创建并可视化一个二维 Delaunay 三角网[^1]。 ```cpp #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Delaunay_triangulation_2.h> #include <iostream> typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Delaunay_triangulation_2<K> Triangulation; int main() { std::vector<K::Point_2> points = {K::Point_2(0, 0), K::Point_2(1, 0), K::Point_2(0, 1), K::Point_2(-1, -1)}; Triangulation dt(points.begin(), points.end()); for (auto vit=dt.finite_vertices_begin(); vit != dt.finite_vertices_end(); ++vit){ std::cout << "Vertex: (" << vit->point().x() << ", " << vit->point().y() << ")" << std::endl; } } ``` 此代码片段展示了如何定义点集,并通过这些点构建 Delaunay 三角形网络。之后遍历所有有限顶点来打印它们的位置坐标。 对于更高维度的情况或更复杂的操作(比如插入新节点),可以查阅官方文档获取更多信息。 #### 利用 PCL 实现 Delaunay 三角化 PCL 是另一个广泛使用的开源计算机视觉处理工具包,在其中也实现了 Delaunay 三角划分方法。这里给出一段基于 PCL 的简单例子: ```cpp #include <pcl/surface/gp3.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> using namespace pcl; PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>); // 假设已经加载好数据到cloud指针所指向的对象里... GreedyProjectionTriangulation<PointXYZ> gp3; gp3.setInputCloud(cloud); PolygonMesh triangles; gp3.reconstruct(triangles); ``` 上述代码段说明了怎样利用贪婪投影三角测量法(Greedy Projection Triangulation),这是一种近似于 Delaunay 的技术,适用于大规模点云的数据结构重建任务。注意这并不是严格意义上的 Delaunay 三角分割,但在很多应用场景下效果良好。 为了获得更好的性能或是特定需求的支持,建议深入研究这两个项目的具体实现细节以及其各自的 API 文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值