CGAL的周期三角剖分(相关信息较少)

news2024/11/27 12:42:52

        CGAL的周期二维三角剖分类旨在表示二维平面上的一组点的三角剖分。该三角剖分形成其计算空间的分区。它是一个单纯复体,即它包含任何k-单纯形的所有关联j-单纯形(j<k),并且两个k-单纯形要么不重叠,要么共享一个公共的j-面,j<k。发生的维度小于等于2的单纯形称为顶点、边缘和面。

1、扁平环面

        二维周期性三角剖分包计算了T2c空间中的三角剖分,该空间定义如下:设c属于R不等于0且G是(c·Z2,+)的群,其中c·Z表示包含所有整数倍c的集合。平环面是以下等式定义的空间:T2c:=R2/G。参数c定义了周期。

        T2c的元素是R2中点集的等价类。我们称这些点为T2c元素的代表。实现不是直接在T2c的元素上工作,而是在R2的一些代表上工作。给定α和β,方块[α,α+c)×[β,β+c)包含T2c中每个元素的唯一代表。我们称其为原始域。从今以后,当我们谈论点时,我们通常指的是原始域内点的代表。请注意,任何输入点都需要是上述定义的原始域的半开方块的元素。

        有一些单纯形包含了原始域内的点,但也包含了原始域外的点。原始域外的点是原始域内点的周期性副本。因此,要指定一个单纯形,我们需要点和一些附加信息来确定每个点的相应周期性副本。T2c的代表的集合是一个方块点网格。我们通过一个二维整数向量(ox,oy)来指定每个代表,称为偏移量。它代表原始域内的代表在x和y方向上必须平移的周期数量。(0,0)对应于原始域内的代表。要指定k单纯形,我们需要k+1个点偏移量对。

2、演示

        三角剖分是通过关联和邻接关系连接在一起的顶点和面的集合。每个面都可以访问它的三个关联顶点、它们的相应偏移量以及它的三个相邻面。每个顶点都可以访问它的一个关联面。

        面的三个顶点在正方向上用0、1和2表示。T2c中单形的方向被定义为R2中相应单形的方向,由各自偏移量确定的代表给出。

        与基础组合三角剖分一样,面的邻居以0、1和2进行索引,使得索引为i的邻居与索引相同的顶点相对。边缘(1-面)没有明确表示:一条边缘由一个面和一个索引给出(面f的边缘i是f的边缘,与索引为i的顶点相对)。

        一些点集在T2c中不承认三角剖分。在这种情况下,我们使用点集的9个周期拷贝,排列在一个边长为3c的正方形中。以这种方式构造的任何点集在R2/G'中都有三角剖分,其中G'=(3c⋅Z)2。因此,我们在这个空间中计算三角剖分,这是一个T2c的9片覆盖空间。

         1个覆盖空间和9个覆盖空间中的相同周期三角剖分。

        管理副本的功能在很大程度上对用户隐藏。但是有一些不可忽视的影响。例如,如果点集不允许在T2c中进行三角剖分,则组合迭代器(Face_iterator、Edge_iterator和Vertex_iterator)会返回内部存储的所有单形,对应于每个几何基元(三角形、线段和点)的9个周期副本。这是确保邻接关系一致性的必要条件。如果希望每个基元只有一个周期副本,我们提供几何迭代器。它们返回三角剖分的几何基元,而没有它们之间的关系。另一个影响是,当算法从9片覆盖切换到1片覆盖时,引用已删除项的Vertex_handles和Face_handles失效。

        在数据结构中,每个顶点存储它对应的输入点。 如果我们在 9 片覆盖空间中计算,每个顶点存储它对应的原始域内的代表。 因此,与 T2c 的同一元素对应的 9 个顶点都在 R2 中存储了相同的代表,而不是不同的周期副本。

        有效性:        周期三角剖分被称为局部有效的,当且仅当:        (a)-(b) 其基础组合图,三角剖分数据结构,在局部是有效的。        (c)任何单元的顶点都是按照正方向排列的。 

3、Delaunay三角剖分

        类Periodic_2_Delaunay_triangulation_2实现了T2c中点集的Delaunay三角剖分。

        Delaunay三角剖分具有空圆性质,即每个面的外接圆不包含三角剖分中的任何其他顶点。这些三角剖分是唯一定义的,除了四个点共圆的退化情况。但是请注意,即使在这些情况下,CGAL实现也会计算出唯一的三角剖分。

        此实现是完全动态的:它支持插入点和删除顶点。

4、三角剖分的继承

        Periodic_2_triangulation_hierarchy_2 类是第 2D_Triangulations 章三角剖分层次一节中描述的层次结构在周期情况下的改编。

        类 Periodic_2_triangulation_hierarchy_2<Tr> 继承了作为模板参数 Tr 传递的三角剖分类型。插入、移动和删除成员函数被重写,以在每次操作时更新数据结构。定位查询也被重写,以利用数据结构进行快速处理。

5、软件设计

        我们选择前缀“Periodic_2”来强调三角剖分在空间的所有两个方向上都是周期性的。还存在“圆柱形”周期性,其中三角剖分仅在空间的一个方向上是周期性的。

        两个主要类Periodic_2_Delaunay_triangulation_2和Periodic_2_triangulation_2提供高级几何功能,并负责几何有效性。 Periodic_2_Delaunay_triangulation_2包含所有Delaunay三角剖分特有的功能,如点插入和顶点删除、圆边测试、查找给定点的冲突区域、对偶函数等。 Periodic_2_triangulation_2包含所有一般三角剖分通用的功能,如三角剖分中点的位置、访问函数、几何查询如方向测试等。

        它们被构建为三角剖分数据结构之上的层,该结构存储了它们的组合结构。几何和组合之间的这种分离在软件设计中反映为三角剖分类采用两个模板参数的事实:

        几何特征类,它提供了用作点的类型以及对它们的基本操作(谓词和构造)。此外,它还包含偏移类型。这个参数的概念在几何特征参数一节中有更详细的描述。应该细化的概念是 Periodic_2Triangulation Traits_2(用于 Periodic_2_triangulation_2)和 Periodic_2DelaunayTriangulation Traits_2(用于 Periodic_2_Delaunay_triangulation_2)。

5.1、几何特征参数

        周期三角剖分类 Periodic_2_triangulation_2< Traits, Tds> 的第一个模板参数是几何特征类,由概念 Periodic_2Triangulation Traits_2 描述。类似地,Delaunay三角剖分类 Periodic_2_Delaunay_triangulation_2< Traits,Tds> 的第一个模板参数是几何特征类,由概念 TPeriodic_2DelaunayTriangulation raits_2 描述。这些概念与 Triangulation Traits_2 和 DelaunayTriangulation Traits_2)的不同之处在于,它们还使用偏移实现了所有对象、谓词和构造。

        类 Periodic_2_Delaunay_triangulation_traits_2< Traits,Periodic_2Offset_2> 提供了所需的功能。 它有两个模板参数:概念 DelaunayTriangulation Traits_2 的模型和概念 Periodic_2Offset_2 的模型。 由于概念 Triangulation_Traits_2 细化了概念 DelaunayTriangulation Traits_2,类 Periodic_2_Delaunay_triangulation_traits_2< Traits,Periodic_2Offset_2> 也是概念 Triangulation Traits_2 的模型。

        Cartesian、Homogeneous、Simple_cartesian、Simple_homogeneous 和 Filtered_kernel 核都可以用作 Traits 的模型。 Periodic_2_triangulation_traits_2 提供精确谓词和精确构造(如果 Traits 提供)。如果使用 Filtered_kernel<CK> 作为第一个模板参数,其中 CK 是不精确内核,则它提供精确谓词,但不提供精确构造。使用 Exact_predicates_inexact_constructions_kernel 作为 Traits 提供快速和精确谓词,但不提供精确构造,使用 Exact_predicates_exact_constructions_kernel 提供快速和精确谓词和精确构造。如果使用点、线段、三角形和四面体的对偶构造和构造,建议使用后者。

        第二个参数Periodic_2Offset_2默认为Periodic_2_offset_2。

5.2、三角剖分数据结构参数

        主要类 Periodic_2_triangulation_2 和 Periodic_2_Delaunay_triangulation_2(剖分方法) 的第二个模板参数是一个三角剖分数据结构类。该类必须是概念 TriangulationDataStructure_2 的模型,该概念描述了该类作为保持关联和邻接关系的面和顶点的容器的要求。

        此外,概念 TriangulationDataStructure_2::Vertex 和 TriangulationDataStructure_2::Face 被扩展为支持周期性:顶点和面必须是 Periodic_2TriangulationVertexBase_2 和 Periodic_2TriangulationFaceBase_2 的模型。此类概念的一个模型是CGAL::Triangulation_data_structure_2。它由一个顶点基类和一个面基类参数化,这使得可以定制三角剖分数据结构使用的顶点和单元,从而使用它的几何三角剖分。提供了顶点和面概念的基本模型:CGAL::Periodic_2_triangulation_vertex_base_2 和CGAL::Periodic_2_triangulation_face_base_2。

        所有三角剖分类中都提供了三角剖分数据结构参数的默认值,因此用户不需要指定,除非他想要使用不同的三角剖分数据结构或不同的顶点或单元基类。

5.3、设计的灵活性

        Periodic_2_triangulation_2 使用 TriangulationDataStructure_2 的方式与 Triangulation_2 基本相同。这就是为什么软件设计中描述的灵活性以完全相同的方式适用。此外,类 Triangulation_vertex_base_with_info_2 和 Triangulation_face_base_with_info_2 可以直接重用。

6、性能

        将二维周期性Delaunay三角剖分的性能与欧几里德二维Delaunay三角剖分进行比较。使用空间排序将点插入欧几里德二维Delaunay三角剖分中。在周期性三角剖分中,首先以随机顺序插入点,直到三角剖分在1个覆盖空间中有效。然后使用空间排序插入剩余的点。对于大型点集,首先插入虚拟点以在1个覆盖空间中创建有效的三角剖分。然后使用空间排序插入所有点。作为最后一步,再次删除虚拟点。

7、可视化 

        通过调用cgal::draw<P2T2>()函数,可以可视化二维周期三角剖分,如下例所示。该函数打开一个新窗口,显示给定的周期三角剖分。周期三角剖分的元素可以以四种不同的模式查

        STORED 显示所有几何图元,因为它们存储在 Triangulation_data_structure_2 中;

        UNIQUE 显示每个几何图元的一个代表,即使在多片覆盖空间中计算三角剖分也是如此;

        STORED_COVER_DOMAIN 与 STORED 相同,但也会显示与当前覆盖空间的原始域相交的非空的所有基元;

        UNIQUE_COVER_DOMAIN 与 UNIQUE 相同,但也会显示与当前覆盖空间的原始域相交的非空的所有基元。

CGAL 5.6 - 2D Periodic Triangulations: User Manual

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

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

相关文章

数据结构与算法-D2D3线性表之顺序表

线性表&#xff1a;包含若干数据元素的一个线性序列&#xff0c;特征如下&#xff1a; 1&#xff09;对非空表&#xff0c;a0是表头&#xff0c;无前驱&#xff1b; 2&#xff09;an-1是表尾&#xff0c;无后继&#xff1b; 3&#xff09;其他元素仅且仅有一个前驱&#xff0c;…

Day02 Liunx高级程序设计2-文件IO

系统调用 概念 是操作系统提供给用户使其可以操作内核提供服务的一组函数接口 用户态和内核态 其中 ring 0 权限最高&#xff0c;可以使用所有 CPU 指令&#xff0c; ring 3 权限最低&#xff0c;仅能使用 常规 CPU 指令&#xff0c;这个级别的权限不能使用访问硬件资…

解决 vite 中 import.meta.globEager is not function 的问题

本人正在重构两年前搭建到一半的博客网站&#xff0c;相关依赖都很陈旧&#xff0c;用到了 npm-check-updates 检测项目可升级依赖&#xff1a; 升级完成后解决完依赖发现控制台报错 import.meta.globEager is not function解决方案&#xff1a; vite版本降至4.3.0 亲测有效&…

Shell数组函数:数组(二)

关联数组 注意&#xff1a;先声明关联数组 一、定义关联数组 方法一 #一次赋一值 #数组名[索引]变量值 [rootlocalhost ~]# declare -A ass_array1 [rootlocalhost ~]# ass_array1[index1]pear [rootlocalhost ~]# ass_array1[index2]apple [rootlocalhost ~]# ass_array1[ind…

gpt阅读论文利器

1. txyz.ai 读论文 严伯钧 3. consensus 两亿科学论文的资源库. 用英文. 中国经济发展, 美国加州没有,减肥没有. 2. chrome插件 gpt sidebar 3. gpt academic 论文润色和学术翻译 ,一键输出公式. 英语口语8000句. 托福备考计划表. 百词斩托福. 薄荷外刊. 分区笔记精读法.…

Container容器技术简介

本文介绍了容器技术出现背景&#xff0c;docker技术与容器编排技术的简单说明 背景 在传统项目的生产环境中&#xff0c;迁移一个用户态进程往往非常麻烦&#xff0c;因为一个用户态进程背后会附带这非常多例如函数库、中间件等的依赖项&#xff0c;但又没有像apt和yum一样的…

广州华锐互动:钢铁厂烫伤事故3D模拟急救演练提高企业应对突发事故能力

随着工业化进程的加快&#xff0c;钢铁行业作为国家经济的重要支柱产业&#xff0c;其安全生产问题日益受到社会各界的关注。近年来&#xff0c;我国钢铁企业不断加大安全生产投入&#xff0c;但事故频发的现象仍然时有发生。为了提高钢铁企业应对突发事故的能力&#xff0c;确…

如何使用llm 制作多模态

首先将任何非字符的序列信息使用特殊n个token 编码。 具体编码方法以图像为例子说明&#xff1a; 将固定尺寸图像如256256 的图像分割为1616 的子图像块。 将已知的所有图像数据都分割后进行str将其看做是一个长的字符&#xff0c;而后去重后方式一个词表。 使用特殊1024 个tok…

推荐6款本周 火火火火 的开源项目

本周 GitHub项目圈选 节选自微博、知乎、掘金等社区。 &#x1f525;&#x1f525;&#x1f525;本周推荐的开源项目是&#xff1a; kopia 日常备份工具 screenshot-to-code 截屏生成代码 MiniSearch 全文搜索 clone-voice 声音克隆 NvChad 高颜值终端 DB-GPT-Hub 文本到…

关于 Kubernetes中Admission Controllers(准入控制器) 认知的一些笔记

写在前面 工作中遇到&#xff0c;简单整理记忆博文为官方文档整理涉及内置准入控制的分类理解理解不足小伙伴帮忙指正 人活着就是为了忍受摧残&#xff0c;一直到死&#xff0c;想明了这一点&#xff0c;一切事情都能泰然处之 —— 王小波《黄金时代》 为什么需要准入控制器 准…

怎样的软件测试工程师才算“大神“?“我“的测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 个优秀的软件测试…

6.Eclipse里下载Subclipse插件

方法一&#xff1a;从Eclipse Marketplace里面下载 具体操作&#xff1a;打开Eclipse --> Help --> Eclipse Marketplace --> 在Find中输入subclipse搜索 --> 找到subclipse点击install 方法二&#xff1a;从Install New Software里下载 具体操作&#xff1a;打开…

RPC基础

RPC基础知识 RPC 是什么? RPC&#xff08;Remote Procedure Call&#xff09; 即远程过程调用&#xff0c;通过名字我们就能看出 RPC 关注的是远程调用而非本地调用。 为什么要 RPC &#xff1f; 因为&#xff0c;两个不同的服务器上的服务提供的方法不在一个内存空间&…

【从零认识ECS云服务器 | 快速上线个人网站】一、ECS概述

首先我们来说什么是服务器&#xff0c;服务器本身就是一种电脑&#xff0c;和我们日常使用的电脑一样&#xff0c;同样具备CPU、内存、硬盘、网卡、电源等硬件&#xff0c;但是由于服务器是24小时不间断运行&#xff0c;所以需要更加强大的配置来支撑其运行&#xff0c;以保障公…

【c】16进制数转化为10进制数(计算方法在最后,大家也可以上网搜索视频,视频更详细,谢谢)

#include<stdio.h> #include<math.h> void trans(char arr1[],int arr[],int n) {puts("请输入16进制的数");for(int i0;i<n;i){scanf("%c",&arr1[i]);arr[i](int)arr1[i];}for(int k0;k<n;k){if(arr[k]>65&&arr[k]<7…

Java的第二十一章:网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可以编写出高质量的网络通信程序。 …

Gee教程6.模板(HTML Template)

这一章节的内容是介绍 Web 框架如何支持服务端渲染的场景 实现静态资源服务(Static Resource)。支持HTML模板渲染。 这一章节很多内容是基于net/http库的&#xff0c;该库已经实现了很多静态文件和HMML模板的相关功能的了。 静态文件 网页的三剑客&#xff0c;JavaScript、C…

CentOS增加虚拟内存 (Linux增加内存)

前言 因为囊中羞涩不敢言&#xff0c;所以内存只有2G&#xff0c;项目在运行的时候&#xff0c;占用的内存已经报表&#xff0c;所以有的时候就会出现宕机的情况发生&#xff0c;后面发现可以通过使用增加虚拟内存空间&#xff0c;来增加内存容量。 下面进入正题&#xff0c;讲…

聊聊 Jetpack Compose 原理 -- Compose 是如何将数据转换成 UI 的?

Compose 是一个声明式的 UI 框架&#xff0c;提供了很多开箱即用的组件&#xff0c;比如 Text()、Button、Image() 等等&#xff0c;Compose 会经过几个不同的阶段&#xff0c;最终渲染出 UI 界面。 此转换过程分为【三个阶段】&#xff1a; 组合&#xff1a; 显示什么布局&a…

【MATLAB源码-第93期】基于matlab的白鲸优化算法(BWO)和鲸鱼优化算法(WOA)机器人栅格路径规划对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 白鲸优化算法&#xff08;BWO&#xff09; 白鲸优化算法是受到白鲸捕食和迁徙行为启发的一种算法。其主要特点和步骤包括&#xff1a; 1. 搜索食物&#xff08;全局搜索&#xff09;&#xff1a;算法模仿白鲸寻找食物的行为。…