Delaunay三角刨分算法理解及c#过程实现
Delaunay三角刨分算法理解及c#过程实现
- 0 引言
- 1 关于三角剖分
- 2 Delaunay三角剖分算法实现及对比
- 3 结语

0 引言
💻💻AI一下💻💻
三角剖分是什么?
三角剖分
是一种将平面或曲面划分成三角形集合的方法。在二维平面中,给定一个平面区域(可以是多边形等),通过连接区域内的一些点,使得整个区域被分割成若干个三角形,这些三角形彼此相邻,且它们的并集就是原来的平面区域。例如,对于一个简单的矩形,我们可以通过连接矩形的对角线,将其三角剖分成两个三角形。
三角剖分需满足的原则?
-
空外接圆原则(Empty - Circumcircle Criterion)
这是 Delaunay 三角剖分最核心的原则。对于任意一个三角形,其外接圆内不包含点集中的其他点。也就是说,如果存在一个点在某个三角形的外接圆内部,那么这个三角形就不符合 Delaunay 三角剖分的要求。
例如,假设有点 A、B、C 构成一个三角形,其外接圆为圆 O。如果在圆 O 内部存在点 D(这个点属于要进行三角剖分的点集),那么三角形 ABC 就需要重新调整,可能会通过连接 AD、BD 或 CD 等来改变三角剖分的结构,以满足外接圆内不包含其他点的条件。 -
最大最小角原则(Max - Min Angle Criterion)
Delaunay 三角剖分在所有可能的三角剖分中,能够使三角形的最小角达到最大。这一原则使得剖分后的三角形形状相对比较 “规则”,尽量避免出现角度过小(如趋近于 0 度)的三角形,因为狭长的三角形在一些应用中(如有限元分析)可能会导致数值计算的不稳定等问题。
例如,在给定一组点进行三角剖分的过程中,有多种连接方式可以形成不同的三角剖分结果。Delaunay 三角剖分算法会倾向于选择那种使得每个三角形的最小角尽可能大的连接方式。 -
局部优化原则(Local Optimization Procedure,LOP)
在构建三角剖分的过程中,当插入一个新的点或者对已有的三角剖分进行调整时,通常会采用局部优化的方法。具体来说,当一个点被插入到现有的三角剖分中,会检查这个点周围的三角形,通过交换对角线等操作来优化局部的三角剖分结构,使其符合 Delaunay 三角剖分的原则。
例如,在逐步构建三角剖分的过程中,新插入一个点 P 后,它周围可能会形成一些新的三角形。这时,会检查这些三角形及其相邻三角形的外接圆情况,如果发现有不符合空外接圆原则的三角形,就会在局部进行调整,比如交换某些三角形的边,直到满足 Delaunay 三角剖分的要求。
本篇基于网络资料,对Delaunay三角剖分算法
原理进行理解,并借鉴多篇优秀博文,对算法进行了实现,结果与Matlab内置函数进行比对,边缘存在划分差异,可以 满足实际需要。
1 关于三角剖分
关于Delaunay三角剖分
的算法网上有大量博文在介绍相关原理,这里不再展开。但在使用网上获得的各种Delaunay三角剖分算法的时候需要仔细斟酌,因为尝试了许多能下载到的代码,运行结果或多或少都有一些问题。下面是实现三角剖分的几个关键步骤
。
(1)构造一个超级三角形,包含所有散点,放入三角形链表;
(2)将点集中的散点依次插入,在三角形链表中找出其外接圆包含插入点的三角形,删除影响三角形的公共边,将插入点同影响三角形的全部顶点连接起来;
(3)根据优化准则对局部新形成的三角形进行优化,将形成的三角形放入 Delaunay 三角形链表;
(4)循环执行上述步骤,直到所有散点插入完毕。
2 Delaunay三角剖分算法实现及对比
本篇参考、使用的程序来自网站,网站主页如下图,浏览网站发现里边不仅有C#版本
的triangulate源码,还有c、c++、Fortran、Java
等版本的三角刨分源码,基于实际用途尝试运行了其中的一些程序,发现个别程序运行结果效果不好。本篇选择使用下图框选区域的程序进行三角刨分,该程序运行效率高、结果也相对准确,大多情况下与Matlab结果基本一致,但是受数据精度影响较大,可能会出现划分错误的情况,使用过程需注意。


用相同的随机二维散点数据,分别代入Matlab程序和上述C#程序
,比较c#程序计算结果是否准确。下面是调用Matlab自带算法进行三角抛分的简单过程:
point = rand(1000,2);
figure
T = delaunay(point);
triplot(T,point(:,1),point(:,2))
以下是C#版本
的三角刨分算法调用过程,C#源码中使用程序仅支持整数类型的坐标点,下面分享的方法是对源码进行的改造,可以支持实数类型的散点进行三角划分,下面仅为定义和关键过程。
## 测试代码,用于驱动计算过程
private void button1_Click(object sender, EventArgs e){Vertex.Clear();Triangle.Clear();// 计算前先释放Graphics g1 = pictureBox2.CreateGraphics();g1.Clear(Color.White);pictureBox2.BackColor = Color.White;string[] lines = File.ReadAllLines(@"basepoint.txt");int N = lines.Length;dVertex tnum;for (int i = 1; i <= N; i++){string line = lines[i - 1];// 拆分行string[] v = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);tnum.x = double.Parse(v[0]);tnum.y = double.Parse(v[1]);tnum.z = 0.0;Vertex.Add(tnum);}int tPoints = N;HowMany = 0;HowMany = Triangulate(ref Vertex, ref Triangle);// 绘图Graphics g;g = pictureBox2.CreateGraphics();this.Show();g.CompositingMode = CompositingMode.SourceOver;g.SmoothingMode = SmoothingMode.None;Pen myPen = new Pen(Color.Blue, 1);for (int i = 0; i <= HowMany - 1; i++){double x1 = Vertex[Triangle[i].vv0].x * pictureBox2.Size.Width;double y1 = Vertex[Triangle[i].vv0].y * pictureBox2.Size.Height;double x2 = Vertex[Triangle[i].vv1].x * pictureBox2.Size.Width;double y2 = Vertex[Triangle[i].vv1].y * pictureBox2.Size.Height;double x3 = Vertex[Triangle[i].vv2].x * pictureBox2.Size.Width;double y3 = Vertex[Triangle[i].vv2].y * pictureBox2.Size.Height;g.DrawLine(myPen, (float)x1, (float)y1, (float)x2, (float)y2);g.DrawLine(myPen, (float)x2, (float)y2, (float)x3, (float)y3
相关文章:
Delaunay三角刨分算法理解及c#过程实现
Delaunay三角刨分算法理解及c#过程实现 0 引言1 关于三角剖分2 Delaunay三角剖分算法实现及对比3 结语0 引言 💻💻AI一下💻💻 三角剖分是什么? 三角剖分是一种将平面或曲面划分成三角形集合的方法。在二维平面中,给定一个平面区域(可以是多边形等),通过连接区域…...
【单片机】实现一个简单的ADC滤波器
实现一个 ADC的滤波器,PT1 滤波器(也称为一阶低通滤波器),用于对输入信号进行滤波处理。 typedef struct PT1FilterSettings PT1FilterSettings; struct PT1FilterSettings {//! last Filter output valueuint32_t filtValOld;//…...
在 Ubuntu 22.04 上从 Wayland 切换到 X11的详细步骤
在 Ubuntu 22.04 上从 Wayland 切换到 X11,步骤其实很简单,主要是在登录界面进行选择。以下是详细的步骤: 步骤 1:退出当前会话 首先,点击屏幕右上角的用户菜单,选择 注销 或 退出,以退出当前…...
NOVA:AutoRegressive Video Generation Without Vector Quantization——自回归视频生成无需向量量化
这篇文章介绍了一种名为NOVA的新型自回归模型,用于高效的文本到图像和文本到视频生成。以下是文章的主要内容总结: 1. 研究背景与问题 自回归大语言模型(LLMs)在自然语言处理(NLP)中表现出色,但…...
79 Openssl3.0 RSA公钥加密数据
1 引言 最近不小心用到了openssl3.0,项目中需要使用rsa非对称加解密算法,所以把openssl3.0使用公钥加密数据的函数调用摸了一遍。 之所以记录此篇文章,是因为网络上大多数是openssl3.0以前的版本的函数接口,而openssl3.0之后已经丢…...
基于单片机的数字电子秒表设计
此文章谨为课设记录 一、实验要求 题目六 数字电子时钟 基本要求: (1) 设计一个单片机电子时钟,设计的电子时钟通过数码管显示; (2) 具有能通过按键实现设置时间的功能; (3) 显示格式为小时十位、小时个位,分…...
rust学习——环境搭建
rust安装:https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html 1、vscode装插件: toml语法支持 依赖管理 rust语法支持 2、创建demo 3、查看目录 4、执行文件的几种方式: rust安装:https://www.rust-lang.org/z…...
解读若依框架中的 @Xss 注解
文章目录 1. 背景与问题定义什么是 XSS 攻击?XSS 的常见类型传统解决方案的局限性 2. Xss 注解详解Xss 注解源码解析注解核心要素 XssValidator 实现解析核心逻辑 3. 应用场景场景一:表单输入校验示例代码 场景二:API 接口参数校验示例代码 4…...
ADO.NET知识总结4---SqlParameter参数
目录 5.1 SqlParameter介绍 5.2 SqlParameter创建参数方式 5.3 添加命令参数 5.4 参数使用 5.1 SqlParameter介绍 SqlParameter: 表示SqlCommand对象的参数,或与DataSet中列的映射。 常用属性 DbType 参数的SqlDbType(即 数据库的类型而言&#x…...
分布式主键ID生成方式-snowflake雪花算法
这里写自定义目录标题 一、业务场景二、技术选型1、UUID方案2、Leaf方案-美团(基于数据库自增id)3、Snowflake雪花算法方案 总结 一、业务场景 大量的业务数据需要保存到数据库中,原来的单库单表的方式扛不住大数据量、高并发,需…...
【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 4:MHE表示能力
目录 1 MHE的表示能力2 基于Frobenius-范数的低秩逼近3 基于CE的低秩近似 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:h…...
Spring Boot 项目启动报 NoClassDefFoundError 异常的原因分析与解决方案 - jackson 版本不一致
目录 报错: 问题分析: 解决方案: 方案 1:对 Jackson 版本进行统一 方案 2:升级 Springfox 版本 方案 3:替换 Springfox 为 springdoc-openapi(推荐) 方案 4:排除冲突的 Jack…...
Ubuntu网络连接问题(笔记本更换wifi后,虚拟机连不上网络)
1、笔记本更换wifi后,虚拟机的IP地址变了,然后就连不上网络了(主机笔记本连接wifi正常上网) 2、修改子网地址(按照ubutun的ip设置子网掩码) 3、Ubuntu已经显示网络连接正常了,但是就是无法上网&…...
vue3中el-table实现多表头并表格合并行或列
1、el-table中添加事件 :span-method"genderSpanCity" <el-table :span-method"genderSpanCity":data"data.tableData":fit"true" table-layout"fixed" header-align"center" stripestyle"width:100%;he…...
Selenium 八大元素定位方法及场景扩展
Selenium 提供了八种常见的元素定位方法,用于在网页中准确找到需要操作的元素。以下是详细介绍以及一些特殊场景的解决方案。 1. ID 定位 用法: 通过元素的唯一 id 属性进行定位。 element driver.find_element(By.ID, "element_id")使用场…...
计算机网络之---网络拓扑
什么是网络拓扑 为什么需要网络拓扑 网络拓扑有哪些 什么是网络拓扑 网络拓扑 是指网络中各设备(如计算机、路由器、交换机等)如何连接以及它们之间数据流动的结构和布局。它是网络设计的一个关键方面,决定了网络的性能、可扩展性、可靠性…...
YOLO11新王登基!实战改进版,杀穿顶会!
众所周知,YOLO一直是发论文的大热门!而YOLO11做为其的最新版本,必然会在2025成为各大顶会的“宠儿”! 主要在于:一方面,YOLO其他系列的改进早已卷成“红海”,而YOLO11提出才几个月,…...
【《游戏编程模式》实战04】状态模式实现敌人AI
目录 1、状态模式 2、使用工具 3、状态模式适用范围 4、实现内容 5、代码及思路 Enemy.cs EnemyState.cs 6、unity里的设置 7、运行效果展示 1、状态模式 “允许一个对象在其内部状态改变时改变自身的行为。对象看起来好像是在修改自身类。” 就是一个对象能随着自己…...
Linux 环境(Ubuntu)部署 Hadoop 环境
前置准备 准备三台机器 cat /etc/hosts 192.168.1.7 hadoop-master 192.168.1.11 hadoop-slave01 192.168.1.12 hadoop-slave02Linux 环境 cat /etc/os-release PRETTY_NAME"Ubuntu 24.10" NAME"Ubuntu" VERSION_ID"24.10" VERSION"24.…...
裸机器搭建k8s部署 1.28.10版本
问了搭建k8s集群踩了很多坑,问题主要出现在网络插件处,因此主要是master节点操作问题。重新走一下流程整理一下笔记。 目录 虚拟机准备 虚拟机 系统版本信息 修改镜像地址 配置静态ip 关闭防火前和交换分区 转发 IPv4 并让 iptables 看到桥接流量…...
np.ndarray 是 NumPy 库中的核心数据结构
np.ndarray 是 NumPy 库中的核心数据结构,代表一个多维数组(或称为矩阵)。它是一个高效的容器,用于存储和操作数据,可以包含任意类型的数据(整数、浮点数、布尔值等)。 主要特点: …...
全新免押租赁系统打造便捷安全的租赁体验
内容概要 全新免押租赁系统的推出,标志着租赁行业的一次重大变革。这个系统的最大特点就是“免押金”,大大减轻了用户在租赁过程中的经济负担。从此,不再需要为一部手机或其他商品支付高昂的押金,用户只需通过简单的信用评估&…...
C语言——结构体,位段,枚举和联合
目录 前言 结构体 1含义 2语法 3匿名结构体 4结构体自引用 5结构体的定义与初始化 6内存对齐 7修改对齐数 8结构体传参 位段 1含义 2位段的内存分配 编辑3位段的问题 4位段的应用 枚举 1含义 2定义 3枚举优点 4枚举使用 联合 1含义 2定义 3特点 4计…...
现场展示deepseek VS openAI o1模型大对比
DeepSeek-V3 模型的发布在 AI 领域引起了广泛关注。作为一款拥有 6850 亿参数的混合专家(MoE)语言模型,DeepSeek-V3 在多个基准测试中表现出色,甚至超越了一些闭源模型。其在 Aider 代码能力排行榜上的正确率达到 48.4%࿰…...
深度解析 tanh tanh 激活函数
1. 引言 在现代深度学习中,激活函数(Activation Function)是神经网络的核心组件之一。它的主要作用是引入非线性,从而使神经网络能够学习和表示复杂的非线性关系。如果没有激活函数,神经网络的输出将只是输入的线性组…...
【Golang 面试题】每日 3 题(二十五)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
Unity Canvas中显示粒子特效
首先在场景中新建一个粒子特效 修改一下参数 1.改变粒子特效的渲染层级,层级修改为UI层,由UI相机渲染 使用粒子特效的Sorting Layer ID和Order In Layer,Sorting Layer ID设置为UI(如果没有UI层则新建就好了),对UI进行排序 对于要显示在前的UI组件添加Canvas组件,设置O…...
excel精简使用工具
1.获取sheet1的行填充到sheet2的列 希望在 Excel 中使用 INDEX 函数从不同的列中提取数据,并且每一行都引用不同的列。为了实现这个目标,你可以使用 COLUMN 函数来动态获取列的偏移量。 为了避免手动输入每个单元格的公式,你可以使用以下公…...
上手体验微软全新整合的王炸平台Fabric
体验确实不错,微软强大的生态能力。 把可视化,数仓,数据胡,数据工厂,机器学习,数据监控等技术都整合到一个平台了。所有数据全都存储在统一的one lake数据中心,消除数据孤岛问题。而且不同角色可…...
Linux 下 Vim 环境安装踩坑问题汇总及解决方法(重置版)
导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …...
RabbitMQ 可观测性最佳实践
RabbitMQ 简介 RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写,支持多种客户端。它通过使用交换机(Exchanges)、队列(Queues)和绑定(Bindings)来路由消息ÿ…...
束搜索、组束搜索介绍、异同及相关参数
束搜索(Beam Search)与组束搜索(Group Beam Search)介绍 束搜索(Beam Search) 束搜索是一种用于序列生成任务的解码算法,广泛应用于自然语言处理领域,如机器翻译、语音识别等。它的…...
深度学习与计算机视觉 (博士)
文章目录 零、计算机视觉概述一、深度学习相关概念1.学习率η2.batchsize和epoch3.端到端(End-to-End)、序列到序列(Seq-to-Seq)4.消融实验5.学习方式6.监督学习的方式(1)有监督学习(2)强监督学习(3)弱监督学习(4)半监督学习(5)自监督学习(6)无监督学习(7)总结:不同…...
新时期下k8s 网络插件calico 安装
1、k8s master节点初始化完毕以后一直处于notreadey状态,一直怀疑是安装有问题或者是初始化有问题(当然,如果真有问题要先解决这些问题),经过不断探索才发现是网络插件没有安装导致的,根据建议安装calico插…...
14:00面试,15:00就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到2月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV:ImageNet pre-trained model NLP:pre-trained model? 在计算机视觉中任务包含分类、检测、分割,任务类别数少,对应…...
Docker: 现代开发的利器,从入门到实践
引言 在现代软件开发中,开发人员面对的环境多种多样,不同操作系统、依赖、库版本等都会影响应用程序的正常运行。传统的开发和部署流程复杂且易错,"在我机器上可以跑"的困扰让许多开发者头疼。而 Docker,一个容器化技术…...
nuxt3 env环境变量
加载env文件 在package.json中指定运行某个env文件:nuxt build --dotenv .env.production 具体如下: "scripts": {"build-dev": "nuxt build --dotenv .env.test","build-prd": "nuxt build --dotenv .e…...
Vue3 自定义插件(plugin)
文章目录 Vue3 自定义插件(plugin)概述用法 Vue3 自定义插件(plugin) 概述 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。 用法 Vue3 插件有2种定义方式: 对象形式。对象中有install方法。函数形式。函数本身就是安装方法,其中ÿ…...
HTB:Bank[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取出靶机TCP开放端口 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用curl对域名进行访问…...
Elastic-Job相关
文档参考视频:09_SpringBoot案例演示_哔哩哔哩_bilibili 一、Elastic-Job介绍 Elastic-Job 是一个轻量级、分布式的任务调度框架,旨在解决分布式环境下的定时任务调度问题。 1.1. Elastic-Job 的核心组件 Elastic-Job 是由多个核心组件构成的&#x…...
Ruby语言的正则表达式
Ruby语言的正则表达式详解 正则表达式(Regular Expressions,简称Regex)是一种强大的文本处理工具,它可以用来匹配、搜索、替换字符串中的模式。在Ruby语言中,正则表达式的使用非常灵活,并且具有良好的可读…...
“深入浅出”系列之QT:(5)Json数据格式处理详解
一、JSON数据结构 JSON主要有两种数据结构:JSON对象和JSON数组。 JSON对象:由键值对组成,每个键(key)是字符串,值(value)可以是字符串、数字、布尔值、null、JSON数组或JSON对象。对…...
cursor试用出现:Too many free trial accounts used on this machine 的解决方法
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Calico BGP网络问题
Calico BGP网络问题 文章目录 Calico BGP网络问题排除步骤calico-node 正常运行,但在 describe 中有警告信息错误现象 ip route 路由表中删除 blackhole后又会自动生成网卡选择无效导致 calico 的 pod 内容器未就绪问题现象原因分析问题解决方式一:直接修…...
Jenkins-部署-windows
Jenkins-部署-windows 一: Jenkins 资料 一: Jenkins 资料...
benchANT 性能榜单技术解读 Part 1:写入吞吐
近期,国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops(时序数据库)场景排名,KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…...
【 算法设计与分析-回顾算法知识点】福建师范大学数学与计算机科学学院 2006 — 2007学年第二学期考试 A 卷
一.填空题(每空2分,共30分) 1.算法的时间复杂性指算法中 元运算 的执行次数。 2.在忽略常数因子的情况下,O、和三个符号中, O 提供了算法运行时间的一个上界。 3.设Dn…...
【25考研】川大计算机复试情况,重点是啥?怎么准备?
24年进入复试的同学中,有10位同学的复试成绩为0分。具体是个人原因还是校方原因,还尚不明确。但是C哥提醒,一定要认真复习!复试完后不要跟任何人讨论有关复试的题目及细节! 一、复试内容 四川大学复试内容较多…...
设计模式-结构型-适配器模式
在软件开发中,随着系统的不断扩展和模块的不断增加,往往会遇到不同模块之间接口不兼容的情况。此时,如果我们能通过某种方式将一个接口转化为另一个接口,那么开发工作将变得更加灵活和高效。适配器模式(Adapter Patter…...