CGAL的2D符合规定的三角剖分和网格

1、符合规定的三角剖分

1.1、定义

        如果三角形的任何面的外接圆在其内部不包含顶点,则该三角形是 Delaunay 三角形。 约束 Delaunay 三角形是一种尽可能接近 Delaunay 的约束三角形。 约束 Delaunay 三角形的任何面的外接圆在其内部不包含从该面可见的数据点。

        如果一条边内接于一个空圆(其内部不包含数据点),则该边被称为德劳内边。如果这条边的直径圆是空的,则该边被称为加布里埃尔边。

        如果每个约束边都是一个Delaunay边,则称约束Delaunay三角剖分是保形的Delaunay三角剖分。由于约束Delaunay三角剖分中的任何边要么是Delaunay边,要么是约束边,因此保形的Delaunay三角剖分实际上是一个Delaunay三角剖分。唯一的区别是其中一些边被标记为约束边。

        如果每个约束边都是加布里埃尔边,则受约束的德劳内三角网被称为一致的加布里埃尔三角网。 加布里埃尔属性比德劳内属性更强,每个加布里埃尔边都是德劳内边。 因此,一致的加布里埃尔三角网也是一致的德劳内三角网。

        任何受约束的Delaunay三角剖分都可以通过在受约束的边上添加称为Steiner顶点的顶点,将其细化为一致的Delaunay三角剖分或一致的Gabriel三角剖分,直到它们被分解为足够小的子约束,成为Delaunay或Gabriel边。

1.2、构建符合规定的三角剖分

        约束Delaunay三角剖分可以通过以下两个全局函数细化为符合规定的三角剖分:

template<class CDT>
void make_conforming_Delaunay_2 (CDT& t)
template<class CDT>
void make_conforming_Gabriel_2 (CDT& t)

        在这两种情况下,模板参数CDT必须由受约束的Delaunay三角剖分类实例化(参见第2章“三角剖分”)。

        用于实例化参数CDT的约束Delaunay三角剖分的几何特征必须是概念ConformingDelaunayTriangulationTraits_2的模型。

        受约束的Delaunay三角剖分t通过引用传递,并通过添加顶点细化为符合规定的Delaunay三角剖分或符合规定的Gabriel三角剖分。建议用户在原始三角剖分必须保留用于其他计算的情况下,对输入三角剖分进行复制。

        make_conforming_Delaunay_2() 和 make_conforming_Gabriel_2() 使用的算法构建了内部数据结构,如果连续调用这两个函数,则需要对这些数据结构进行两次计算。为了避免这些数据被构造两次,高级用户可以使用 Triangulation_conformer_2<CDT> 类将约束 Delaunay 三角网细分为符合 Delaunay 三角网,然后再细分为符合 Gabriel 三角网。为了对细化算法进行额外控制,该类还提供了单独的函数,一次插入一个 Steiner 点。 

1.3、范例

         从左到右:初始Delaunay三角剖分、相应的一致Delaunay和相应的Gabriel三角剖分。

2、网格

2.1、定义

        网格是将给定区域划分为形状和大小满足若干标准的单形。

        域是用户想要网格化的区域。它必须是平面的有界区域。域由平面直线图定义,简称为Pslg,它是一组线段,其中两条线段要么不相交,要么共享一个端点。Pslg的线段是约束,将由网格中的边集表示。Pslg还可以包含孤立点,这些孤立点将作为网格的顶点出现。

        Pslg的段可以是边界段或内部约束段。Pslg的段必须覆盖域的边界。

        Pslg将平面划分为几个连通分量。默认情况下,域是有界连通分量的并集。

        下图显示了不使用种子点定义的域的示例及其可能的网格。

        定义的域没有种子点和生成的网格。

        用户可以通过提供一组种子点来覆盖此默认值。种子点标记要网格化的组件,或者标记不要网格化(孔)的组件。 

        关于用相同的Pslg和用于定义孔的两个种子点定义的另一个域,请参见下图。在相应的网格中,这两个孔是三角形的,但不是网格。

        具有两个种子点的域,定义孔和生成的网格。 

2.2、形状和尺寸标准

        三角形形状标准是圆半径与最短边长之比的下界B。这样的界意味着三角形最小角度的下界为arcsin(1/2)B,最大角度的上界为π-2*arcsin(1/2)B。不幸的是,只有当B≥2√时,算法的终止才有保证,这对应于角度的下界为20.7度。

        大小标准可以是任何倾向于偏好小三角形的标准。例如,大小标准可以是三角形最长边的长度的上限,或者外接圆半径的上限。大小限制可以在域中变化。例如,对于与给定线相交的三角形,大小标准可以规定一个较小的尺寸。

        这两种类型标准都定义在对象criteria中,并作为参数传递给网格化函数。

2.3、网格剖分算法

        网格问题的输入是一个Pslg和一组描述要网格化的域的种子,以及一组尺寸和形状标准。此包中实现的算法从输入Pslg的约束Delaunay三角划分开始,并使用Delaunay细化方法生成网格。此方法将新顶点插入三角划分中,尽可能远离其他顶点,并在满足标准时停止。

        如果输入Pslg的入射段之间的所有角度都大于60度,并且如果圆周率/边比的界限大于2√,则该算法保证终止于满足尺寸和形状标准的网格。

        如果某些输入角度小于 60 度,算法最终将得到一个网格,其中一些三角形在小输入角度附近违反了标准。这是不可避免的,因为输入段形成的小角度无法被抑制。此外,已经证明,某些具有小输入角度的域不能以甚至小于小输入角度的角度进行网格划分。请注意,如果域是多边形区域,则生成的网格将满足除小输入角度之外的大小和形状标准。此外,该算法可能成功地产生角度下限大于 20.7 度的网格,但没有任何保证。

2.4、构建网格

template<class CDT, class NamedParameters>
void refine_Delaunay_mesh_2 (CDT &t, NamedParameters np)

        模板参数CDT必须由受约束的Delaunay三角剖分类实例化。

        CDT 的几何特征类必须是概念 DelaunayMeshTraits_2 的模型。这个概念通过添加几何谓词和构造函数来细化概念 ConformingDelaunayTriangulationTraits_2。

        第二个模板参数 NamedParameters 允许传递一系列种子点来定义域。它还允许传递三角形必须满足的网格化标准。该标准必须是 MeshingCriteria_2 的模型。 

        CGAL为这个概念提供了两个模型:

        Delaunay_mesh_criteria_2<CDT>,定义了一个形状标准,限制三角形的最小角度,
Delaunay_mesh_size_criteria_2<CDT>,它为前面的标准添加了一个最大边长度的限制。

        如果使用不同的标准对同一个三角网格调用函数 refine_Delaunay_mesh_2() 多次,则算法会在每次调用时重建用于网格化的内部数据结构。为了避免每次调用时重建数据结构,高级用户可以使用类 Delaunay_mesher_2<CDT>。这个类还提供了逐步函数。这些函数一次插入一个顶点。

        Delaunay_mesher_2<CDT> 类型的任何对象都是从对 CDT 的引用构造的,并且具有几个成员函数来定义要网格化的域并对 CDT 进行网格化。有关详细信息,请参见下面给出的示例和参考手册。请注意,在 Delaunay_mesher_2<CDT> 对象的生存期内,不应从外部修改 CDT。

        一旦构建了网格,就可以使用面类型的 is_in_domain() 成员函数来确定三角剖分中的哪些面位于网格域中。 

2.5、Lloyd法优化网格

        该包还提供了一个全局函数,用于在Delaunay精化生成的网格上运行Lloyd优化迭代。这种网格优化的目标是改善网格内部的角度,并使其尽可能接近60度。

template< class CDT >
Mesh_optimization_return_code lloyd_optimize_mesh_2(CDT& cdt);

         请注意,此全局函数有几个命名参数来调整优化过程。

        该优化过程交替地将顶点重新定位到其Voronoi单元的质心,并更新三角剖分的Delaunay连通性。质心是根据一个尺寸函数计算的,该函数旨在保持Delaunay细化生成的网格中点的局部密度。

        下图,这是由refine_Delaunay_mesh_2()生成并使用lloyd_optimize_mesh_2()优化的网格。下图显示了这些网格内角度的直方图。

        (左)由refine_Delanay_mesh2()生成的网格,用于统一大小调整标准。(右)显示了Lloyd优化100次迭代后的相同网格。 

         Delaunay细化后以及Lloyd优化的10次和100次迭代后网格内部角度的直方图。Delaunay精化后,角度在[28.5;121.9]度的区间内。经过10次Lloyd优化迭代后,它们处于[29.1;110.8]。100次迭代使它们达到[29.3;109.9]。

3、输入\输出

        可以使用函数 ATTRIBUTE::IO::write_VTU()导出VTU中的网格结果。有关此格式的更多信息,请参阅VTK(VTU / VTP)文件格式。

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

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

相关文章

陀螺仪LSM6DSV16X与AI集成(3)----读取融合算法输出的四元数

陀螺仪LSM6DSV16X与AI集成.2--姿态解算 概述视频教学样品申请完整代码下载使用demo板生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始化SFLP步骤初始化SFLP读取四元数数据演示 概述 LSM6DSV16X 特性涉及到的是一种低功耗的传感器融合算法&#xff08;Sensor…

MySQL之创建时间类型的字段表

mysql之创建时间类型的字段表 CREATE TABLE tab(birthday DATE, -- 生日job_time DATETIME, -- 记录年月日时分秒login_time TIMESTAMP -- 时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )解释&#xff1a; NOT NULL DEFAULT &#xff1a;默认不为空…

css未来:使用light-dark()切换主题色

css未来&#xff1a;使用light-dark()切换主题色 要根据使用的是浅色模式还是深色模式来更改颜色&#xff0c;我们通常会使用 prefers-color-scheme 媒体查询。为了让代码实现变得更容易&#xff0c;CSS 现在附带了一个名为 light-dark() 的实用函数。该函数接受两个颜色值作为…

编译原理lab3-cminus_compiler-LLVM简要熟悉

lab3实验报告&#xff0c;我的实验报告图例很少&#xff0c;这次只有两张图&#xff0c;其余的都以复制输出的形式展现出来了&#xff0c;最终提交的代码在最后 [[#你的提交|你的提交]][[#实验设计|实验设计]][[#提交一&#xff1a;手动编写.ll|提交一&#xff1a;手动编写.ll…

TREK610C高压放大器

181/2461/8938技术规格 输出电压&#xff1a;0到10 kV直流电压 输出电流&#xff1a;0到2 mA 转换率&#xff1a;大于500 V/μs 信号带宽&#xff1a;直流到1.0 kHz &#xff08;-3dB&#xff09; 放大倍数&#xff1a;1000 V/V 闭环系统以保持低噪音、高精确度电压输出 短…

最简单的基于 FFmpeg 的音频解码器

最简单的基于 FFmpeg 的音频解码器 最简单的基于 FFmpeg 的音频解码器正文参考工程文件下载 参考雷霄骅博士的文章&#xff0c;链接&#xff1a;最简单的基于FFMPEGSDL的音频播放器&#xff1a;拆分-解码器和播放器 最简单的基于 FFmpeg 的音频解码器 正文 FFmpeg 音频解码器…

Spring Cloud Gateway 网关的基础使用

1. 什么是网关&#xff1f;网关有什么用&#xff1f; 在微服务架构中&#xff0c;网关就是一个提供统一访问地址的组件&#xff0c;它解决了内部微服务与外部的交互问题。网关主要负责流量的路由和转发&#xff0c;将外部请求引到对应的微服务实例上。同时提供身份认证、授权、…

Spring-Boot---配置文件

文章目录 配置文件的作用配置文件的格式PropertiesProperties基本语法读取Properties配置文件 ymlyml基本语法读取yml配置文件 Properties VS Yml 配置文件的作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;具有非常重要的作用。比如&#xff1a; 数据库的…

Python绘制多分类ROC曲线

目录 1 数据集介绍 1.1 数据集简介 1.2 数据预处理 2随机森林分类 2.1 数据加载 2.2 参数寻优 2.3 模型训练与评估 3 绘制十分类ROC曲线 第一步&#xff0c;计算每个分类的预测结果概率 第二步&#xff0c;画图数据准备 第三步&#xff0c;绘制十分类ROC曲线 1 数据集…

【数据结构】——排序篇(上)

前言&#xff1a;前面我们已经学过了许许多多的排序方法&#xff0c;如冒泡排序&#xff0c;选择排序&#xff0c;堆排序等等&#xff0c;那么我们就来将排序的方法总结一下。 我们的排序方法包括以下几种&#xff0c;而快速排序和归并排序我们后面进行详细的讲解。 直接插入…

Qt实现二维码生成和识别

一、简介 QZxing开源库: 生成和识别条码和二维码 下载地址&#xff1a;https://gitcode.com/mirrors/ftylitak/qzxing/tree/master 二、编译与使用 1.下载并解压&#xff0c;解压之后如图所示 2.编译 打开src目录下的QZXing.pro&#xff0c;选择合适的编译器进行编译 最后生…

MIT6S081-Lab2总结

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 Lab2就是了解一下xv6的系统调用流程&…

解决服务端渲染程序SSR运行时报错: ReferenceError: document is not defined

现象&#xff1a; 原因&#xff1a; 该错误表明在服务端渲染 (SSR) 过程中&#xff0c;有一些代码尝试在没有浏览器环境的情况下执行与浏览器相关的操作。这在服务端渲染期间是一个常见的问题&#xff0c;因为在服务端渲染期间是没有浏览器 API。 解决办法&#xff1a; 1. 修…

【2023传智杯-新增场次】第六届传智杯程序设计挑战赛AB组-DEF题复盘解题分析详解【JavaPythonC++解题笔记】

本文仅为【2023传智杯-第二场】第六届传智杯程序设计挑战赛-题目解题分析详解的解题个人笔记,个人解题分析记录。 本文包含:第六届传智杯程序设计挑战赛题目、解题思路分析、解题代码、解题代码详解 文章目录 一.前言二.赛题题目D题题目-E题题目-F题题目-二.赛题题解D题题解-…

深入理解Sentinel系列-1.初识Sentinel

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

如何搭建自己的直播电商系统?

当下&#xff0c;传统的图文电商模式已经走向没落&#xff0c;视频电商备受追捧。抖音、快手、小红书、京东、淘宝、拼多多都在发力直播电商业务&#xff0c;尤其是以抖音为首的直播电商备受用户欢迎&#xff0c;它具有实时直播和强互动的特点&#xff0c;是传统电商所不具备的…

最长子串问题(LCS)--动态规划解法

题目描述&#xff1a; 如果Z既是X的子串&#xff0c;又是Y的子串&#xff0c;则称Z为X和Y的公共子串。 如果给定X、Y&#xff0c;求出最长Z及其长度。 注意&#xff1a;这里求的不是子序列&#xff0c;两者的意思并不相同。子串要求连续&#xff0c;子序列并不需要。 如果想…

simulinkveristandlabview联合仿真环境搭建

目录 开篇废话 软件版本 明确需求 软件安装 matlab2020a veristand2020 R4 VS2017 VS2010 软件安装验证 软件资源分享 开篇废话 推免之后接到的第一个让人难绷的活&#xff0c;网上开源的软件资料和成功的案例很少&#xff0c;查来查去就那么几篇&#xff0c;而且版本…

SpringData

1.为什么要学习SpringData&#xff1f; 是因为对数据存储的框架太多了&#xff0c;全部都要学习成本比较高&#xff0c;SpringData对这些数据存储层做了一个统一&#xff0c;学习成本大大降低。

SQL命令---修改字段的数据类型

介绍 使用sql语句修改字段的数据类型。 命令 alter table 表明 modify 字段名 数据类型;例子 有一张a表&#xff0c;表里有一个id字段&#xff0c;长度为11。使用命令将长度修改为12 下面使用命令进行修改&#xff1a; alter table a modify id int(12) NOT NULL;下面使修…