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

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.hqwc.cn/news/238367.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Monkey

一、Monkey的概念 “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人&#xff08;就像猴子一样&#xff09;不需要知道程序的任何用户交互方面的知识&#xff0c;如果给他一个程序&#xff0c;他就会针对他看到的界面进行操作&#xff0c;其操作是无目的的、乱点乱按…

scrapy爬虫中间件和下载中间件的使用

一、关于中间件 之前文章说过&#xff0c;scrapy有两种中间件&#xff1a;爬虫中间件和下载中间件&#xff0c;他们的作用时间和位置都不一样&#xff0c;具体区别如下&#xff1a; 爬虫中间件&#xff08;Spider Middleware&#xff09; 作用&#xff1a; 爬虫中间件主要负…

用 CloudCanal 快速验证阿里云 EMR for StarRocks 和 Doris

背景 StarRocks 和 Doris 是近两年来相当流行的、国产的、开源的实时数仓&#xff0c;不仅数据检索、分析能力出众&#xff0c;而且数据准备实时性好、准确度高、使用丝滑&#xff0c;可如同在线数据库般使用。 CloudCanal 在早期即支持此两种实时数仓&#xff0c;并且经过多…

JavaScript 内存泄漏的检测与防范:让你的程序更稳定

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

.netcore 操作aspose.words导出pdf

个人重点关注的是生成曲线图的部分&#xff0c;浪费了我很多时间 chart.Legend.Position LegendPosition.Top; 控制图形的显示位置&#xff0c;这个地方好像必须要选一个位置&#xff0c;否则会内容显示不全&#xff0c;我开始用的LegendPosition.None&#xff0c;他就显示…

京东数据运营-京东数据开放平台-鲸参谋10月粮油调味市场品牌店铺销售数据分析

鲸参谋监测的京东平台10月份料油调味市场销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年10月份&#xff0c;京东平台粮油调味市场的销量将近4600万&#xff0c;环比增长约10%&#xff0c;同比降低约20%&#xff1b;销售额将近19亿&#xff0c;环比增长约4%&am…

VT-VRPA2-1-1X/V0/T5控制4WRE6比例方向阀放大板

带阀芯位移反馈不带集成式放大器比例方向阀控制放大器&#xff0c;替代力士乐同型号产品&#xff0c;可以完全互换使用&#xff1b;适用于控制力士乐系列带电位置反馈的4WRE6通径和4WRE10通径2X系列比例方向阀&#xff1b;0~10V、4~20mA指令控制信号任意可选&#xff1b;直接安…

Docker 镜像及其命令

文章目录 镜像Docker 镜像加载原理联合文件系统bootfs和rootfs镜像分层 镜像分层的优势容器层常用命令 镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖打包好形成一个可交付的运行环境&#xff…

cmake和vscode 下的cmake的使用详解(二)

第四讲&#xff1a; GDB 调试器 前言&#xff1a; GDB(GNU Debugger) 是一个用来 调试 C/C 程序 的功能强大的 调试器 &#xff0c;是 Linux 系统开发 C/C 最常用的调试器 程序员可以 使用 GDB 来跟踪程序中的错误 &#xff0c;从而减少程序员的工作量。 Linux 开发 C/C …

SQL Sever 基础知识 - 限制行数

SQL Sever 基础知识 - 三、限制行数 三、限制行数第1节 OFFSET FETCH - 限制查询返回的行数1.1 OFFSET 和 FETCH 子句1.2 SQL Server OFFSET 和 FETCH 示例 第2节 SELECT TOP - 限制查询结果集中返回的行数或行的百分比2.1 SELECT TOP 子句2.2 PERCENT2.3 WITH TIES2.4 SELECT …

Excel导入操作

<template><el-dialogwidth"500px"title"员工导入":visible"showExcelDialog"close"$emit(update:showExcelDialog, false)"><el-row type"flex" justify"center"><div class"upload-e…

计算机毕业设计 基于SpringBoot的敬老院管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…