【三维重建】Delaunay三角剖分学习笔记

本文只是学习笔记,所有图和基本内容均出自原文。

原文链接:技术分享:Delaunay三角剖分算法介绍 - 知乎 (zhihu.com)

一、三角剖分:

1.1 基础理论

给定的平面点集,生成三角形集合的过程。考虑平面(空间)点集P,得到三角形集合T:

a)所有三角形的端点恰好构成集合P。

b)任意两个三角形的边不相交(要么重合,要么没有交点)。

c)所有三角形的合集构成P的凸包(convex hull)。

凸包(Convex Hull)指的是一组点中最小的凸多边形或凸多面体,将这些点包围在内部,同时保持凸性。这个凸包的边界是由这些点构成的,包围内部的点集。

由于给定点集的三角剖分不唯一,三角形“质量”(quality)最好,不希望三角形过于狭长,也就是说越接近等边三角形越好:

a) 最小角(minimum angle):即所有三角形的内角当中最小的角。

b) 纵横比(aspect ratio):三角形最短边与最长边的比例。

c) 半径比(radius ratio):三角形内接圆半径的两倍与外接圆半径的比例。

1.2 空圆

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

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

对三角剖分中的一条边,若存在一个外接圆满足空圆性质,称为一条Delaunay边。(一条边的外接圆可以是经过这条边两个顶点的任意圆,不唯一。)

对三角剖分中的一条属于两个三角形 t1,t2 的边e,若存在一个外接圆不包含三角形 t1,t2中的任何顶点称为局部Delaunay边。若一条边只属于一个三角形,也属于局部Delaunay边。

1.3 Delaunay引理

对一个三角剖分T,以下三个命题相互等价

a) T中所有三角形均为Delaunay三角形。(Delaunay三角剖分的定义)

b) T中所有三角形的边均为Delaunay边。

c) T中所有三角形的边均为局部Delaunay边。

Jonathan Schewchuk---Delaunay triangulation

1.4 翻转边算法

翻转边算法 : 对三角剖分T中的一条边e,若它不是局部Delaunay的,则可以被翻转成为一条局部Delaunay边e’。

翻转:两个三角形的合集所构成的四边形有两条对角线,e为其中一条。现在用另一条对角线e’替换e。

每进行一次翻转边操作时,都把三角剖分“局部”地改善了:

a) 最小角增大:翻转边e后的两个相邻三角形的6个内角中的最小角大于等于原先的两个三角形6个内角中的最小角。

b) 外接圆半径缩小:翻转边e后的两个相邻三角形的外接圆半径最大值小于等于原先的两个三角形外接圆半径的最大值。

c) 四点共圆的情况:若一条边e的两个相邻三角形的顶点A,B,C,D四点共圆,则无论翻转与否,这条边都是局部Delaunay边。

1.5 剖分的最优性质

a) 最大化最小角性质:

在给定点集P的所有三角剖分当中,Delaunay三角剖分得到的最小角(所有三角形的内角中的最小值)是最大的。

b) 最小化外接圆性质:

在给定点集P的所有三角剖分当中,Delaunay三角剖分得到的最大外接圆半径(所有三角形的外接圆半径中的最大值)是最小的。

c)若点集P中任意四点不共圆,则存在唯一的Delaunay三角剖分T。若点集P中四点A,B,C,D共圆,且△ABC,△BCD属于Delaunay三角剖分T,那么将边BC翻转后得到的三角剖分T’(包含△ABD,△ACD)同样是一个Delaunay三角剖分。

二、Delaunay三角剖分的构造算法

Delaunay三角剖分的构造算法都是通过逐点插入来实现的。

而每当插入一个新的顶点时,将其与附近的旧顶点连接会加入一些新的边,我们只要用翻转边算法来修正其中的“坏边”,就可以将其重新“修复”为Delaunay三角剖分。

2.1 Lawson算法 (2D)

2.1.1 计算点集P的包围盒

先计算点集P的包围盒(bounding box),将包围盒的四个顶点加入P中得到P’。根据包围盒生成两个超三角形(super triangles),构成初始三角剖分 T0 。由于只包含两个直角三角形, T0 是(包围盒四个顶点的)一个Delaunay三角剖分。

这里的包围盒是点集的包围盒,在二维空间中,包围盒通常是矩形;而在三维空间中,它是一个长方体(或称为立方体)。

超三角形是大到足以容纳所有点的特殊三角形。在二维情况下,它们通常是一个大的等边三角形或者外接圆无限大的三角形。在三维空间中,它们可能是一个大的四面体或外接球无限大的四面体。

2.1.2 将点集P中的顶点逐一插入

将点集P中的顶点逐一插入现有的三角剖分 Ti 中,并进行如下调整:

➤设插入的顶点v位于三角形t中,将v与三角形的三个顶点连接,使t分裂为3个三角形 t1,t2,t3。(内部分裂)

➤分别检查  t1,t2,t3 是否满足空圆性质,若不满足则进行翻转边操作,直到没有坏边为止。此时得到一个包含顶点v的新Delaunay三角剖分。

2.1.3 最后删除

当最后一个顶点插入到三角剖分中,并且完成所有翻转边操作后,我们得到了点集P’的一个Delaunay三角剖分。现在删除第一步中加入的包围盒的四个顶点,并且去除所有与它们连接的三角形,则剩下的三角形就构成点集P的Delaunay三角剖分T。

总的思路就是,先构建一个大的三角形,然后逐步在三角形中插入点,一边插入,一边构成新的三角形一边优化。

2.2 Bowyer-Watson算法(2D)

在Lawson算法的基础上,可以再做一点改进:在插入新的顶点之后,不要立刻与旧顶点连接生成新的三角形,再去逐一翻转坏边。而是先去寻找哪些边是需要翻转的,直接将这些边删掉形成一个“空穴”(cavity),然后在空穴当中连接新的边。这就是Bowyer-Watson算法的思路。

a) 同Lawson算法

b) 将点集P中的顶点逐一插入现有的三角剖分中,并进行如下调整:

➤在现有三角剖分中,所有外接圆包含顶点v的三角形的合集构成一个“星形多边形”(star shaped polygon)。星形多边形的含义是多边形的任何一个顶点到v的连线都在多边形内部。

➤对于上述星形多边形,将其内部的三角形全部删除,形成一个“空穴”。将空穴边界的顶点与新添加的顶点v连接得到新的三角形,替代剖分中被删除的三角形,此时得到一个包含顶点v的新Delaunay三角剖分。

c) 同Lawson算法

三、基于Delaunay三角剖分的网格生成算法、

Delaunay平面区域网格生成算法

a)包围盒->两个超三角形作为初始三角网格。根据边界曲线生成边界点

b) 将边界点逐一插入到三角网格中。每一步插入后,用Bowyer-Watson算法得到新的Delaunay三角网格。

c) 将第一步插入的辅助顶点删除(同时删除与其连接的三角形),得到关于全部边界点的Delaunay三角网格(亦即边界点的Delaunay三角剖分)。

d) 在区域内部的三角形,根据一定的条件,将重心(centroid)插入三角网格,并根据Bowyer-Watson算法调整,得到新的Delaunay三角剖分。直到不再有需要插入的重心点,此时得到区域的完整Delaunay三角网格。(?)

三维模型的Delaunay三角网格生成算法

生成三维模型的Delaunay 三角网格通常包含以下步骤:

  1. 点集确定: 首先确定三维空间中的一组点,这些点通常代表着模型的顶点或特征点。

  2. 超立方体的构建: 通过将点集放置在一个超立方体(三维情况下是一个立方体)内,找到能够包含所有点的最小立方体。

  3. 初始三角剖分: 利用超立方体的顶点生成初始的三角形网格,构成超立方体的外表面,这些三角形通常不是Delaunay 三角形。

  4. 进行Delaunay 三角剖分: 进行迭代算法,通过不断地对不符合Delaunay 三角形的三角形进行改进,直到所有的三角形都满足Delaunay 三角形的性质。

    • 检查不满足的三角形: 针对每个不满足Delaunay 三角形条件的三角形,确定哪些顶点需要连接,以便使其满足Delaunay 三角形的要求。

    • 边的翻转: 如果发现一个三角形不满足Delaunay 三角形条件,需要进行边的翻转。这意味着替换不符合条件的边为符合条件的边,以使新的三角形满足Delaunay 三角形的性质。

    • 迭代: 反复执行翻转操作,直到所有的三角形都满足Delaunay 三角形的条件为止。这个过程可能需要多轮迭代,尤其在点集分布不规则或稀疏时。

  5. 输出: 得到满足Delaunay 三角形条件的三角网格作为最终的三维模型表示。

这里要注意的是,每个面上的点需要两份编号,一个局部(local)编号用于参数区域上的三角网格,及一个全局(global)编号用于三维空间的整体三角网格。在网格生成过程中需要时刻保持这两种编号的对应关系。

参考文献:

Lecture notes on Delaunay triangulation, Jonathan Richard Schewchuk

Delaunay三角剖分算法,百度百科

Delaunay triangulation, Wikipidea

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值