CGAL中2D三角剖分的数据结构

news2024/11/18 18:35:17

1、定义

        三角剖分数据结构是一种设计用于处理二维三角剖分表示的数据结构。三角剖分数据结构的概念主要是设计用作CGAL2D三角剖分类的数据结构,这些类是嵌入平面中的三角剖分。然而,这个概念似乎更一般,可以用于任何可定向的无边界三角剖分曲面,无论三角剖分嵌入的空间维数是多少。

1.1、一种基于面和顶点的数据结构

        CGAL2D三角剖分的表示基于面和顶点,边仅通过两个面之间的邻接关系隐式表示。

        三角剖分数据结构可以被看作是面和顶点的容器,用于维护它们之间的关联和邻接关系。

        每个三角形面都可以访问它的三个入射顶点和它的三个相邻面。每个顶点都可以访问它的一个入射面,并通过该面访问它的入射面的循环列表。

        面的三个顶点用索引0、1和2。面的邻居也用索引0、1、2,这样用i索引的邻居与具有相同索引的顶点相对。见下图,该图所示的函数ccw(i)和cw(i)分别计算i+1和i-1模3。

        每个边都有两个隐式表示:与索引为i的顶点相对的面f的边,可以表示为f的邻居(i)的边。

        这种对单形复体的表示在任何维度上都是可扩展的。更准确地说,在维度 d 中,数据结构将显式表示单元(即最大维度的面)和顶点(即维度为 0 的面)。所有介于 1 和 d-1 之间的维度的面都将有一个隐式表示。二维三角剖分数据结构可以表示 2、1 或 0 维的单形复体。 

1.2、顶点和面的集合

        二维三角剖分数据结构所维护的面集合是每个边缘与两个面相交的集合。换句话说,所维护的面集合在拓扑上等价于二维三角剖分的球体。

        此规则扩展到出现在退化情况或三角剖分具有少于三个顶点的情况下的低维三角剖分数据结构。一维三角剖分结构维护一组顶点和边,它们形成一个环,在拓扑上等价于一个1-球体。

        零维三角剖分数据结构只包括两个相邻的顶点,在拓扑上等价于一个0-球体。

2、三角剖分数据结构的概念

        可以看出,TriangulationDataStructure_2模型有一个用于三角剖分面和顶点的容器。这个类还负责三角剖分的组合完整性。这意味着在进行三角剖分的组合修改时,三角剖分数据结构保持三角剖分顶点和面之间的适当关联和邻接关系。组合修改一词是指不涉及三角剖分几何嵌入知识的操作。例如,在给定面或给定边缘中插入新顶点,抑制度为三的顶点,翻转两条边是在数据结构级别执行的组合操作的例子。

        三角测量数据结构需要提供:三角剖分的顶点和面的类型 Vertex 和 Face;类型Vertex_handle和Face_handle,它们是Handle概念的模型,通过它们可以访问顶点和面;迭代器,用于访问三角剖分的所有顶点、边和面;循环器访问给定顶点相关的所有顶点、边和面;三角剖分数据结构负责创建和删除面和顶点(内存管理)。它提供的功能可以给出三角剖分中的面、边和顶点的数量。

        三角剖分数据结构提供成员函数以执行三角剖分的以下组合变换:两个相邻面的翻转;添加一个新的顶点来分割给定的面;添加分割给定边的新顶点;增加一个新的顶点,使退化的低维三角测量的维数增加一;移除入射到三个面的顶点;删除降低三角测量尺寸的顶点

3、默认的三角剖分数据结构

        CGAL提供了类 Triangulation_data_structure_2<Vb,Fb> 作为默认的三角剖分数据结构。

3.1、灵活性

        为了提供灵活性,默认的三角剖分数据结构由两个参数模板化,这两个参数分别代表顶点基类和面基类。概念TriangulationDSVertexBase_2和TriangulationDSFaceBase_2描述了三角剖分数据结构的顶点和面类的要求。

        这种设计允许用户插入三角剖分数据结构,其中包含针对其应用而调整的自己的顶点或面类。

3.2、模板参数的循环依赖性

        由于邻接关系和关联关系存储在顶点和面中,因此顶点和面类必须知道三角剖分数据结构提供的面和顶点上的句柄类型。因此,顶点和面类需要由三角剖分数据结构模板化。由于三角剖分数据结构本身是由顶点和面类模板化的,这导致了一种循环依赖关系。

3.3、重新绑定机制

       CGAL提出的解决这种循环依赖的解决方案基于类似于标准分配器类 std:: allocator 中使用的机制的重新绑定机制。 插入三角剖分数据结构实例化的顶点和面类本身是用一个伪数据结构实例化的。 然后,三角剖分数据结构将重新绑定这些类,将自己插入伪数据结构的位置,然后再使用它们来派生顶点和面类。 重新绑定是通过顶点和面类中的嵌套模板类 Rebind_TDS 执行的,该类将重新绑定的类作为称为 Other 的类型提供。

        这是它的工作原理图。首先,这是三角剖分数据结构中的重新绑定。

template < class Vb, class Fb >
class Triangulation_data_structure
{
typedef Triangulation_data_structure<Vb,Fb> Self;
// Rebind the vertex and face base to the actual TDS (Self).
typedef typename Vb::template Rebind_TDS<Self>::Other VertexBase;
typedef typename Fb::template Rebind_TDS<Self>::Other FaceBase;
// ... further internal machinery leads to the final public types:
public:
typedef ... Vertex;
typedef ... Face;
typedef ... Vertex_handle;
typedef ... Face_handle;
};

3.4、使用灵活性

        有几种方法可以利用三角测量数据结构提供的灵活性。

        首先,当用户需要在顶点和面中拥有不依赖于三角剖分数据结构所定义类型的附加信息时,可以插入预定义的类 Triangulation_vertex_base_with_info_2 和 Triangulation_face_base_with_info_2。这些类有一个模板参数 Info,由用户定义的类型实例化。它们存储此类型的数据成员,并允许对其进行访问。

        其次,用户可以从默认基类中派生自己的基类:Triangulation_ds_vertex_base_2和Triangulation_ds_face_base_2是默认基类,可插入单独使用的三角剖分数据结构。三角剖分类需要一个数据结构,其中已经插入了其他基类。大多数三角剖分类的默认基类是Triangulation_vertex_base_2,而Triangulation_face_base_2是三角剖分数据结构插入三角剖分类时的默认基类。

        最后,用户可以编写自己的基类。如果单独使用三角剖分数据结构,则基类的要求由概念TriangulationDSVertexBase_2和TriangulationDSFaceBase_2描述。如果三角剖分数据结构被插入到三角剖分类中,则顶点和基类的概念取决于三角剖分类。适用于基本三角剖分和Delaunay三角剖分的最基本概念是TriangulationVertexBase_2和TriangulationFaceBase_2。

CGAL 5.6 - 2D Triangulation Data Structure: User Manual

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

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

相关文章

Robotframework自动化常见问题总结

Robotframework自动化新手常见问题总结 1. 经常有人问这个元素找不到&#xff0c;一般先排除这两个地方&#xff0c;再自己找找 A&#xff1a;是否等待了足够的时间让元素加载 (增加sleep xx, wait Until xxx) B: 仔细查查&#xff0c;这个元素是否进入到另一个frame了 (sel…

从订阅式需求发展,透视凌雄科技DaaS模式增长潜力

订阅制&#xff0c;C端消费者早已耳熟能详&#xff0c;如今也凭借灵活、服务更新稳定的特点&#xff0c;逐渐成为B端企业服务的新热点。 比如对中小企业而言&#xff0c;办公IT设备等配套支出都必不可少&#xff0c;但收入本身并不稳定&#xff0c;购置大堆固定资产&#xff0…

uniapp实现文件预览过程

H5实现预览 <template><iframe :src"_url" style"width:100vw; height: 100vh;" frameborder"0"></iframe> </template> <script lang"ts"> export default {data() {return {_url: ,}},onLoad(option…

激光SLAM:Faster-Lio 算法编译与测试

激光SLAM&#xff1a;Faster-Lio 算法编译与测试 前言编译测试离线测试在线测试 前言 Faster-LIO是基于FastLIO2开发的。FastLIO2是开源LIO中比较优秀的一个&#xff0c;前端用了增量的kdtree&#xff08;ikd-tree&#xff09;&#xff0c;后端用了迭代ESKF&#xff08;IEKF&a…

7、单片机与W25Q128(FLASH)的通讯(SPI)实验(STM32F407)

SPI接口简介 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根…

【学习记录】从0开始的Linux学习之旅——应用开发(helloworld)

一、概述 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程&#xff0c;具有强大的网络功能和良好的兼容性。本文主要讲述如何在linux系统上进行应用开发。 二、概念及原理 应用程序通过系统调用与…

理解BatchNormalization层的作用

深度学习 文章目录 深度学习前言一、“Internal Covariate Shift”问题二、BatchNorm的本质思想三、训练阶段如何做BatchNorm四、BatchNorm的推理(Inference)过程五、BatchNorm的好处六、机器学习中mini-batch和batch有什么区别 前言 Batch Normalization作为最近一年来DL的重…

漏洞复现--Tenda路由器DownloadCfg信息泄露

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

IntelliJ IDEA创建springboot项目时不能选择java8的问题解决方案

最近博主也有创建springboot项目&#xff0c;发现了IntelliJ IDEA在通过Spring Initilizer初始化项目的时候已经没有java8版本的选项了。 基于这个问题&#xff0c;有了这篇文章的分享&#xff0c;希望能够帮助大家克服这个困难。 如图&#xff0c;现在创建springboot项目的时…

BLIoTLink工业协议转换软件功能和使用教程

1.功能简介 BLIoTLink 是一款各种 PLC 协议、Modbus RTU 、Modbus TCP、DL/T645 等多 种协议转换为 Modbus TCP、OPC UA、MQTT、BACnet IP、华为云 IoT、亚 马逊云 IoT、阿里云 IoT、ThingsBoard、钡铼云 IoT 等协议的软件。 BLIoTLink 下行支持&#xff1a;各种 PLC 协议、Mod…

ES6知识

作用域 局部作用域 局部作用域分为函数作用域和块作用域 函数作用域 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问。函数的参数也是函数内部的局部变量。不同函数内部声明的变量无法互相访问。函数执行完毕后&#xff0c;函数内部的变量实际被清空…

【代码】考虑差异性充电模式的电动汽车充放电优化调度matlab-yalmip-cplex/gurobi

程序名称&#xff1a;考虑差异性充电模式的电动汽车充放电优化调度 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;提出了一种微电网中电动汽车的协调充电调度方法&#xff0c;以将负荷需求从高峰期转移到低谷期。在所提出的方法中&#xff0c;基于充…

(一)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

AutoDL 使用记录

AutoDL 使用记录 1.租用新实例 创建实例需要依次选择&#xff1a;计费方式 → \to → 地区 → \to → GPU型号与数量 → \to → 主机 注意事项&#xff1a; 主机 ID&#xff1a;一个吉利的机号有助于炼丹成功价格&#xff1a;哪个便宜选哪个最高 CUDA 版本&#xff1a;影响…

操作系统-输入输出管理

I/O设备的基本概念和分类 I/O就是输入/输出 I/O设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。 I/O设备按使用特性分类 人机交互类外部设备存储设备网络通信设备 I/O设备按传输速率分类 低速设备中…

小米智能摄像头mp4多碎片手工恢复案例

小米智能摄像头mp4多碎片手工恢复案例 智能摄像头目前在市场上极为常见&#xff0c;仅需要一张存储卡即可实现视频、音频的采集&#xff0c;同时可以通过手机APP进行远程控制&#xff0c;相比传统安防品牌成本更低、更容易部署。在智能摄像头品牌中小米算是绝对的大厂&#xf…

HTTP协议、Java前后端交互、Servlet

文章目录 抓包工具 FiddlerHTTP 请求和响应结构URL 唯一资源定位符HTTP 协议中的方法请求报头&#xff08;header&#xff09;HTTP响应构造 HTTP 请求基于 form 标签基于 ajax使用 Postman HTTPS和 HTTP 的区别对称密钥和非对称密钥数字证书 TomcatServlet创建 Maven 项目引入依…

SSM框架(四):SSM整合 案例 + 异常处理器 +拦截器

文章目录 一、整合流程图1.1 Spring整合Mybatis1.2 Spring整合SpringMVC 二、表现层数据封装2.1 问题引出2.2 统一返回结果数据格式 代码设计 三、异常处理器3.1 概述3.2 异常处理方案 四、前端五、拦截器5.1 概念5.2 入门案例5.3 拦截器参数5.4 拦截器链 一、整合流程图 1.1 S…

2.qml 3D-View3D类学习

本章我们来学习View3D类。 View3D是用来渲染3D场景并显示在2D平面的类&#xff0c;并且该类可以放在QML2D下继承于Item子类的任何场景中&#xff0c;比如将View3D放在Rectangle中: Rectangle {width: 200 height: 200color: "red"View3D { anchors.fill: parent…

STM32CubeIDE(CUBE-MX hal库)----蓝牙模块HC-05(详细配置)

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 STM32CubeIDE(CUBE-MX hal库)----定时器 文章目录 系列文章目录前言一、蓝牙配置二、CUBE-MX可视化配置三、蓝牙APP调试助手四、…