CGAL 二维Delaunay三角剖分

一、概述

  类Delaunay_triangulation_2<Traits,Tds>用来表示平面上一组数据点的Delaunay三角剖分。Delaunay三角剖分满足以下空圆性质(也称为Delaunay性质):三角剖分的任何面的围合圆内部不包含任何数据点。对于没有四个共圆点子集的点集,Delaunay三角剖分是唯一的,它与点集的Voronoi图是对偶的。类Delaunay_triangulation_2<Traits,Tds>源自类Triangulation_2<Traits,Tds>。类Delaunay_triangulation_2<Traits,Tds>继承由基本类Triangulation_2<Traits,Tds>定义的类型。traits类提供的其他类型被定义为表示双重Voronoi图。类Delaunay_triangulation_2<Traits,Tds>覆盖在三角剖分中插入、移动或移除点的成员函数,以维护Delaunay属性。它还有一个成员函数(Vertex_handle Delaunay_triangulation_2::nearest_vertex(const Point& p))来进行最近邻查询,还有一个成员函数来构造双Voronoi图的元素(顶点和边)。

二、代码实现

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>   // 内核
#include <CGAL/Projection_traits_xy_3.h>   // xy投影面
#include <CGAL/Delaunay_triangulation_2.h> // Delaunay三角剖分

#include <fstream>
// 保存成.ply
#include <CGAL/Surface_mesh.h>
#include <CGAL/boost/graph/graph_traits_Delaunay_triangulation_2.h>


typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Projection_traits_xy_3<K>  Gt;
typedef CGAL::Delaunay_triangulation_2<Gt> Delaunay;
typedef K::Point_3   Point;
using Mesh = CGAL::Surface_mesh<Point>;

int main()
{
	std::ifstream in("terrain.cin");
	std::istream_iterator<Point> begin(in);
	std::istream_iterator<Point> end;

	Delaunay dt(begin, end);
	std::cout << dt.number_of_vertices() << std::endl;

	// 保存成.ply
	Mesh dsm_mesh;
	CGAL::copy_face_graph(dt, dsm_mesh);
	std::ofstream dsm_ofile("terrain.ply", std::ios_base::binary);
	CGAL::IO::set_binary_mode(dsm_ofile);
	CGAL::IO::write_PLY(dsm_ofile, dsm_mesh);
	dsm_ofile.close();

	return 0;
}

三、结果展示

在这里插入图片描述

四、测试数据

1 2 3 1
4 5 6 1
1 2 3 1
7 8 9 1
3 5 6 1
7 8 3 1
9 6 7 1
5 6 3 1
4 3 8 1
5 5 8 1
7 4 2 1
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Delaunay三角剖分是计算机图形学中常用的方法,它是将点云转化为无重叠的三角形集合的过程。对于三维点云而言,我们可以利用C++语言编写Delaunay三角剖分的源代码。 具体而言,我们需要借助第三方库来完成这个过程。例如,我们可以使用CGAL库中的Delaunay_triangulation_3类来实现三维点云的Delaunay三角剖分。在使用该类之前,我们需要将点云转化为一系列顶点,将顶点作为参数传入Delaunay_triangulation_3类的对象中。 在通过Delaunay_triangulation_3类计算Delaunay三角剖分后,我们可以通过遍历三角形集合,计算每个三角形的顶点坐标和法向量,从而得到三维点云的表面重建结果。 需要注意的是,Delaunay三角剖分的结果可能会产生“拟合问题”,即存在一些三角形的边缘与点云的表面重建结果不完全吻合。为了解决这个问题,我们可以使用一些优化方法,例如对三角形的边缘进行局部调整,以提高重建结果的精度。 总之,通过编写三维点云Delaunay三角剖分的源代码,我们可以将点云转化为一系列无重叠的三角形,从而实现三维模型的重建。 ### 回答2: 三维点云 delaunay 三角剖分是一种将无序的三维点云数据转化为三角形面片的方法,可以在三维建模、地质勘探等领域中应用。其源代码一般采用 C++ 编写,下面简单介绍其实现。 三维点云 delaunay 三角剖分主要分为以下几步: 1. 构建超级三角形。为了保证所有点都在三角剖分内部,需要在点云的边界之外添加一个超级三角形(一般为一个比点云面积大的等边三角形),保证所有点都在其内部。 2. 将点逐一插入。从点云中随机选取一个点开始,将其插入到当前三角剖分中。插入过程中会检查新插入点与其它三角形的关系,同时进行三角形翻转和边的反转等操作以维护 delaunay 三角剖分的特性。 3. 剖分收敛。当所有点都插入完成后,需要对剩余的三角形进行处理,将所有与超级三角形相交的三角形删除,以得到最终的三角剖分结果。 其源代码主要包括点的数据结构定义、超级三角形的构建、插入点和剖分收敛等函数的实现。在实现中需要注意,对于边界点或重复点等特殊情况需要进行处理,同时可根据具体应用场景做出一些优化。 ### 回答3: 三维点云的Delaunay三角剖分源代码是一个算法实现,可以将一个三维点云数据集转化为一组无重叠三角形的连接。这个算法通常由C++实现,并且主要包含以下步骤: 首先,需要定义一个三维点云数据结构,用于存储所有的点。然后,通过半边数据结构来表示三角形的连接关系,并创建一个起始三角形,该三角形的外接圆可以囊括所有的点。 接下来,使用一个扫描线算法来生成三角剖分。该算法主要通过在扫描线上移动,并利用拐角点的概念来不断更新Delaunay三角形网格。在每个点上,都会查找在当前点的左侧和右侧的最高顶点,并通过一个旋转操作来更新三角形的连接关系。 通过以上步骤,就可以生成一个Delaunay三角剖分,其中每个三角形都与它的外接圆不包含任何点。这个算法在计算几何和计算机图形学领域十分流行,并且有多种优化和扩展,可以更好地满足具体应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值