Delaunay三角网生成算法
目录
- 一、分而治之算法
- 二、三角网生长算法
- 三、逐点插入算法
- 四、约束Delaunay三角网
- 1、方法一
- 1、原始点云
- 2、构网结果
- 1、方法二
- 1、原始点云
- 2、普通Delaunay
- 3、约束Delaunay
Delaunay三角剖分分为直接三角剖分和间接三角剖分。间接三角剖分首先计算为Voronoi图,然后由Voronoi图产生Delaunay三角网。这种方法的算法复杂、内存开销大、效率低,现今很少使用。直接Delaunay三角剖分是利用离散点按照空外接圆或者最大最小内角性质,直接生成Delaunay三角网,是目前基于离散点三角剖分的主流算法。
Delaunay三角剖分分成三类:分而治之算法、三角网增长算法和逐点插入算法。
一、分而治之算法
分而治之算法最早是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中生成三角网时,采用了递归运算,需占用较大的系统内存。
二、三角网生长算法
三角网生长算法最早由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)。因此该算法的时间效率低,优点是占用内存空间较小。在该算法的基础上有许多的改进算法,其改进点主要集中在“第三点”的搜索和三角形重复的判断上。
三、逐点插入算法
逐点插入算法的思想最早由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)。该算法的时间效率低,优点是算法思路较简单,占用内存空间较小,空间性能较好。
通常,分而治之算法的效率是最高的,但是当数据量比较大,分块比较多时,块之间的合并算法复杂,且花时也多,并且递归执行,内存消耗大;三角网生长算法和逐点插入法的执行效率差不多,但是在构网的过程中逐点插入法能保持较好的空间特性。
四、约束Delaunay三角网
1、方法一
1、原始点云

2、构网结果

1、方法二
1、原始点云

2、普通Delaunay

3、约束Delaunay

相关文章:
Delaunay三角网生成算法
目录 一、分而治之算法二、三角网生长算法三、逐点插入算法四、约束Delaunay三角网1、方法一1、原始点云2、构网结果 1、方法二1、原始点云2、普通Delaunay3、约束Delaunay Delaunay三角剖分分为直接三角剖分和间接三角剖分。间接三角剖分首先计算为Voronoi图,然后由Voronoi图产…...
hashcode是什么?有什么作用?
文章目录 (1)hashcode()方法的作用(2)equals和hashcode的关系(3)百度百科(4)小白解释 Java中Object有一个方法: public native int hashcode(); (1࿰…...
【人体姿态估计】(一)原理介绍
【人体姿态估计】(一)原理介绍 一、背景 人体姿态估计本质上是一个关键点检测的项目; 关键点检测在生活中的应用十分广泛,包括人脸识别、手势识别,而人体姿态估计则是对身体的关键点进行检测; 本文将介…...
一种新的流:为 Java 加入生成器(Generator)特性
作者:文镭(依来) 前言 这篇文章不是工具推荐,也不是应用案例分享。其主题思想,是介绍一种全新的设计模式。它既拥有抽象的数学美感,仅仅从一个简单接口出发,就能推演出庞大的特性集合,引出许多全新概念。…...
《数据结构C++版》实验一:线性表的顺序存储结构
实验目的 1、实现线性表的顺序存储结构 2、熟悉C++程序的基本结构,掌握程序中的头文件、实现文件和主文件之间的相互关系及各自的作用 3、熟悉顺序表的基本操作方式,掌握顺序表相关操作的具体实现 实验内容 对顺序存储的线性表进行一些基本操作。主要包括: (1)插入:操作…...
ChatGPT的开源平替,终于来了!
最近这段时间,一个号称全球最大ChatGPT开源平替项目Open Assistant引起了大家的注意。 这不最近还登上了GitHub的Trending热榜。 https://github.com/LAION-AI/Open-Assistant 根据官方的介绍,Open Assistant也是一个对话式的大型语言模型项目ÿ…...
Redis基础
Redis6 1. NoSQL数据库简介 1.1 技术发展 技术的分类 1、解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN。 2、解决扩展性的问题:Struts、Spring、SpringMVC、Hibernate、Mybatis。 3、解决性能的问题:NoSQL、Jav…...
为什么重视安全的公司都在用SSL安全证书?
我们今天来讲一讲为什么重视安全的公司都在用SSL证书 SSL证书是什么? SSL安全证书是由权威认证机构颁发的,是CA机构将公钥和相关信息写入一个文件,CA机构用他们的私钥对我们的公钥和相关信息进行签名后,将签名信息也写入这个文件…...
嵌入式QT (使用 Qt Designer 开发)
一、使用 UI 设计器开发程序 1.1、 在 UI 文件添加一个按钮 1.2、在 UI 文件里连接信号与槽 所谓信号即是一个对象发出的信号,槽即是当这个对象发出这个信号时,对应连接的槽就发被执行或者触发。 UI 设计器里信号与槽的连接方法一: 在主窗…...
每日一个小技巧:今天告诉你拍照识别文字的软件有哪些
在现代社会里,手机已经成为了人们生活中必不可少的工具。它的功能众多,比如通讯、上网、拍照以及导航等,为我们的生活带来了许多便利。除此之外,手机还能帮助我们解决一些实际的问题,例如,当你需要识别图片…...
多版本VersionARXDBG
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、一级标题二级标题三级标题四级标题五级标题六级标题总结前言 提示:这里可以添加本文要记录的大概内容: VersionARXDBG,多版本,2023.4.22-4.23两天时间,分别研究了在多版本编译ARXDB…...
# 生成器
生成器 生成器是什么? 生成器(generator)是一种用来生成数据的对象。它们是普通函数的一种特殊形式,可以用来控制数据的生成过程。 生成器有什么优势? 使用生成器的优势在于它们可以在生成数据的同时控制数据的生成过程…...
Netty 源码解析(上)
序 Netty的影响力以及使用场景就不用多说了, 去年10月份后,就着手研究Netty源码,之前研究过Spring源码,MyBatis源码,java.util.concurrent源码,tomcat源码,发现一个特点,之前的源码都…...
Vue 消息订阅与发布
消息订阅与发布,也可以实现任意组件之间的通信。 订阅者:就相当于是我们,用于接收数据。 发布者:就相当于是媒体,用于传递数据。 安装消息订阅与发布插件: 在原生 JS 中 不太容易实现消息订阅与发布&…...
如何在你的云服务器/云主机上更新并使用最新版本的python(python3.11)
更新并使用最新版本的python3.11 第一步,登录云服务器,并更新系统包 打开您的终端(Terminal)或使用任意SSH客户端,输入如下命令来登录云主机: ssh 用户名IP地址 在输入密码后,您将成功登录到云…...
python学习——【第八弹】
前言 上篇文章 python学习——【第七弹】学习了python中的可变序列集合,自此python中的序列的学习就完成啦,这篇文章开始学习python中的函数。 函数 在学习其他编程语言的时候我们就了解过函数:函数就是执行特定任何以完成特定功能的一段代…...
铁路应答器传输系统介绍
应答器传输系统 应答器传输系统是安全点式信息传输系统,通过应答器实现地面设备向车载设备传输信息。 应答器可根据应用需求向车载设备传输固定的(通过无源应答器)或可变的(通过有源应答器)上行链路数据。 当天线单…...
Baumer工业相机堡盟工业相机如何通过BGAPI SDK直接实现Mono16位深度的图像保存(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK直接实现Mono16位深度的图像保存(C#) Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1:引用合适的类文件2:通过BGAPI SDK直接保存Mono12/16图像3…...
C语言入门篇——介绍篇
目录 1、什么是C语言 1、C语言的优点 3、语言标准 4、使用C语言的步骤 5、第一个C语言程序 6、关键字 1、什么是C语言 1972年,贝尔实验室的丹尼斯里奇和肯汤普逊在开发UNIX操作系统时设计了C语言,C语言是在B语言的基础上进行设计。C语言设计的初衷…...
Latex数学公式排版
文章目录 Latex使用最佳方式:读官方文档Latex中的字符数学公式排版1.引入宏包:2.公式排版基础3.数学符号(1).希腊字母(2).指数,上下标,导数(3).分式和根式(4).关系符(5).算符(6).巨算符(7).箭头 Latex使用 最佳方式:读官方文档 The not so short intro…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
