Delaunay三角化实现原理

2023-11-16

一,概述

本人还有一些细节没理清,所以希望大家多多交流

了解定义什么是Delaunay三角大家可以看其他博客,或者看纸异兽大佬做的演示网站写的很清楚了,这里一张图带过(实际上这个方法的点可以是任意维度的点,这里只是以二维举一个例子):
这里写图片描述

这里主要说一下怎么实现的
判断方法三角形是不是Delaunay三角形很简单,这个三角形做外接圆,外接圆内或者圆上没有其他点
实现方法很多:
这里写图片描述
这里说的Bowyer–Watson algorithm

二,图形化解释

主要看的维基百科对于wiki的图示有些地方我不是太看懂他的颜色图示,所以以下所有的图都不是wiki的原图,为了方便说明我对其做了修改,也许我理解的不对,忘请纠正

1. 超级三角形插入第一个点

我们一共有五个点做Delaunay三角化,首先需要注意一点,以下图中的正方形方框,假设就是图片大小,所有的点都必须在这个方框内,而超级三角形只是为了算法的实现,有外接矩形所构造的一个虚拟的三角形

这里写图片描述

2. 插入第二个点

这里写图片描述

* 给图中所有红边三角形(除去超级三角形,下文同样), 做外接圆
* 新插入的点P2在 S1S2P1 S 1 S 2 P 1 S0P2S2 S 0 P 2 S 2 的外接圆内,所以删除线 S2P1 S 2 P 1
* 并同时把绿色线变成红色线(绿色线其实在判断完新插入点的条件后,要连接的线,为下一个点的插入做准备),变成下图:

这里写图片描述

3. 插入第三个点

这里写图片描述

对所有红线构成的三角形做外接圆,判断点P3是不是在外接圆内。显然 S1P2S2 S 1 P 2 S 2 外接圆不符合条件,所以要删除这个三角形,问题是删除哪条边。我觉得有两种解释:

* 超级三角形的边是不会删除的,而 S1P2S2 S 1 P 2 S 2 外接圆符合判定条件,所以 S2P2 S 2 P 2 不删除
* 三角形 S1P1P2 S 1 P 1 P 2 的外接圆不符合判定条件,与 S1P2S2 S 1 P 2 S 2 外接圆公共边是 S1P2 S 1 P 2 ,所以删除 S1P2 S 1 P 2
个人倾向于第一种,因为wiki给的图没有 S1P1P2 S 1 P 1 P 2 的外接圆,后期还要看一下代码,这里才清楚
根据伪代码,是删除不符合判定条件的三角形共享的边

for each edge in triangle do
   if edge is not shared by any other triangles in badTriangles
      add edge to polygon

依旧删除 S1P2 S 1 P 2 ,绿线变成红线
这里写图片描述

4. 插入第四个点

这里写图片描述

这次很nice,红线的三角形都满足判定条件。直接红线变成绿线
这里写图片描述

5. 插入第五个边

这里写图片描述
方法同上,两个黄色的外接圆,去掉 P3S2 P 3 S 2 ,绿线变红线
这里写图片描述

6. 在超级三角形中移除具有极值的边

最后蓝色的边就是我们所求得
这里写图片描述

三,性质:

  1. 不喜欢瘦的三角形
    所谓的瘦,就是一个钝角很大的钝角三角形
    这里写图片描述

四,代码:

1. 伪代码:

这里写图片描述
首先说明一下,下面说的遍历三角形不包括超级三角形,坏三角形就是不符合文章开头判定条件的三角形.。polygan是多边形,是我们删掉一些边后中间过程的图形。好边就是我们要留下的边。
triangulation就是我们现在的有效图形的。

两个主要的for循环,第二个for循环就是从左完成以后去掉多余的边。就是对应图示6
主要看第一个for循环遍历点集中的所有的点:

  • 遍历所有三角形。不符合判定条件的,添加到坏三角形
  • 遍历所有坏三角形的所有边。找出好边。
  • 遍历所有坏三角形。删掉坏边。
  • 遍历好边。加到有效图形当中
    这里写图片描述

2. C++实现:

  1. 实现的库
  2. opencv实现
    网上的基本都是看着<学习opencv>这本书写的,我这里只是记录一下自己的过程。
    一个不错的链接而且有三个能跑的代码,点这里

3. C#实现:

https://blog.csdn.net/k346k346/article/details/52244123

参考:

  1. wiki Bowyer–Watson algorithm
  2. https://www.cnblogs.com/zhiyishou/p/4430017.html
  3. https://blog.csdn.net/NewThinker_wei/article/details/45598769
  4. https://blog.csdn.net/k346k346/article/details/52244123
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delaunay三角化实现原理 的相关文章

  • Linux 自带的LED 灯驱动实验

    目录 Linux 内核自带LED 驱动使能 Linux 内核自带LED 驱动简介 LED 灯驱动框架分析 module platform driver 函数简析 gpio led probe 函数简析 设备树节点编写 运行测试 前面我们都是

随机推荐

  • 数学建模算法(基于matlab和python)之 Lagrange插值、Newton插值(1/10)

    实验目的及要求 1 了解多项式插值公式的存在唯一性条件及其余项表达式的推导 2 了解拉格朗日插值多项式的构造 计算及其基函数的特点 牛顿插值多项式的构造与应用 差商 差分的计算及基本性质 实验内容 1 编写Lagrange插值法 Newto
  • ctfshow-web入门——命令执行(2)(web41-web57)

    命令执行 2 web 41 if isset POST c c POST c if preg match 0 9 a z i c 过滤了数字 字母 大小写 还有一些其他符号 未过滤或运算符 和双引号 eval echo c else hig
  • Gof23设计模式之工厂方法模式和抽象工厂模式

    在java中 万物皆对象 这些对象都需要创建 如果创建的时候直接new该对象 就会对该对象耦合严重 假如我们要更换对象 所有new对象的地方都需要修改一遍 这显然违背了软件设计的开闭原则 如果我们使用工厂来生产对象 我们就只和工厂打交道就可
  • Bootstrap3 多个模态对话框无法显示的问题

    今天帮同事调了一个代码 他们的项目最近在用Bootstrap做开发 突然间 他遇到了一个奇怪的问题 如果一个页面中 有多个Modal对话框的话 排列在第一个的对话框 能够正确显示 第二个 只能导致页面出现MASK层 却不能显示Dialog
  • 数据库作业14:第五章: 数据库完整性 习题 + 存储过程

    今有以下两个关系模式 职工 职工号 姓名 年龄 职务 工资 部门号 其中职工号为主码 Worker Wno Wname Wage Wjob Wsalary Wdept 部门 部门号 名称 经理名 电话号 其中部门号为主码 Dept Dno
  • 2D Fast Marching Computations

    Fast Marching method 跟 dijkstra 方法类似 只不过dijkstra方法的路径只能沿网格 而Fast Marching method的方法可以沿斜线 Level Set Methods and Fast Marc
  • MySQL-索引详解(四)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 树高千尺 落叶归根人生不易 人间真情 前言 本次MySQL 索引章节比较多 分为多篇进行发布 本章继续 链接
  • shell的字符串截取

    shell的字符串截取 这里介绍一下shell当中字符串截取的几种方法 假设有变量 var http www aaa com 123 htm 1 号截取 删除左边字符 保留右边字符 echo var 其中 var 是变量名 号是运算符 表示
  • Python学习第六天——函数(一)

    1 为什么用函数 1 代码冗余 程序组织结构不清晰 可读性差 2 扩展性差 2 如何让使用函数 原则 先定义后使用 定义不会执行 但是会检查语法错误 函数名指向内存地址存储代码信息 先通过函数名找到函数的内存地址 然后函数内存地址的 触发代
  • 使用docker安装nginx

    一 获取nginx镜像 1 获取nginx镜像列表 docker search nginx 2 拉取nginx镜像到本地 注 默认选取官方最新镜像 其它版本可以去DockerHub查询 docker pull nginx 3 查看镜像库 获
  • ROS搬运 笔记1

    图概念概述 Nodes 节点 一个节点即为一个可执行文件 它可以通过ROS与其它节点进行通信 Messages 消息 消息是一种ROS数据类型 用于订阅或发布到一个话题 Topics 话题 节点可以发布消息到话题 也可以订阅话题以接收消息
  • linux 下qt的头文件,Qt添加库文件和头文件目录(QCreator)

    在使用QtCreator开发图像处理程序的时候想加入Opencv库来处理图形 添加头文件 需要编辑工程文件夹下的 pro文件在文件中添加以下内容 即可包含头文件的文件夹 INCLUDEPATH D OpenCV2 0 vc2008 incl
  • 电脑安装Chrome OS

    原文地址 https www ithome com html win10 336501 htm 2010年12月7日 谷歌发布了一款桌面操作系统 Chrome OS 关于这款操作系统的新闻 IT之家没少报道过 相信不少读者对这款操作系统比较
  • 闪回表+查看和修改撤销表空间的信息+闪回表操作语法+闪回表的案例

    闪回表 flashback table 1将表回滚到一个过去的时间点或系统改变号scn上 用来快速恢复表的数据 2用户对表数据的修改操作 都记录在撤销表空间中 3需要使用到与撤销表空间相关的undo信息 通过show parameeter
  • 数据分析36计(19):美国生鲜配送平台【Instacart】如何实现按时配送——使用分位数回归...

    往期系列原创文章集锦 数据分析36计 18 Shopify如何使用准实验和反事实来优化产品 数据分析36计 17 Uber的 A B 实验平台搭建 数据分析36计 16 和 A B 测试同等重要的观察性研究 群组研究 VS 病例 对照方法
  • go的timer

    看程序 package main import fmt time func main time AfterFunc 3 time Second func fmt Println come here 1 timer time NewTimer
  • 每日一练(三十七)

    文章目录 3 1 求字符串的子串个数 3 2 判断程序输出 3 3 strlen 实现 3 4 strcmp 实现 3 5 strcat 实现 每日一练合集 3 1 求字符串的子串个数 3 2 判断程序输出 3 3 strlen 实现 in
  • node.js中的url.parse方法详解

    parse 方法接受一个URL字符串 解析它 然后返回一个URL对象 如果urlString不是字符串 则抛出类型错误 如果存在auth属性但无法解码 则会抛出URIError 语法 url parse urlStr parseQueryS
  • 医生如何使用ChatGPT提高工作效率

    文章目录 引言 案例一 快速获取医学知识 案例二 协助患者自我诊断 案例三 辅助临床决策 案例四 提供在线咨询服务 案例五 用病人易于理解的语言总结关键的临床信息 案例六 高效整理医疗文件 案例七 根据患者的文化水平定制患教材料 案例八 面
  • Delaunay三角化实现原理

    一 概述 二 图形化解释 1 超级三角形插入第一个点 2 插入第二个点 3 插入第三个点 4 插入第四个点 5 插入第五个边 6 在超级三角形中移除具有极值的边 三 性质 四 代码 1 伪代码 2 C 实现 3 C 实现 参考 一 概述 本