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…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...