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.mfbz.cn/a/232837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】【面试经典150 | 动态规划】爬楼梯

Tag 【动态规划】【数组】 题目来源 70. 爬楼梯 题目解读 有过刷题「动态规划」刷题经验的读者都知道&#xff0c;爬楼梯问题是一种最典型也是最简单的动态规划问题了。 题目描述为&#xff1a;你每次可以爬 1 或者 2 个台阶&#xff0c;问爬上 n 阶有多少种方式。 解题思路…

d8week17

Week7 lec17 TVD去asscess model &#xff08;本质 距离加权平均&#xff09;text 11.2A New Statistic: The Distance between Two Distributions text-11.11.1 数据拿到手&#xff0c;套路操作 -- 看hist分布2 total variation distance lec18lec19 lec17 TVD去asscess model…

GoLong的学习之路,进阶,微服务之使用,RPC包(包括源码分析)

今天这篇是接上上篇RPC原理之后这篇是讲如何使用go本身自带的标准库RPC。这篇篇幅会比较短。重点在于上一章对的补充。 文章目录 RPC包的概念使用RPC包服务器代码分析如何实现的&#xff1f;总结Server还提供了两个注册服务的方法 客户端代码分析如何实现的&#xff1f;如何异步…

随机分词与tokenizer(BPE->BBPE->Wordpiece->Unigram->sentencepiece->bytepiece)

0 tokenizer综述 根据不同的切分粒度可以把tokenizer分为: 基于词的切分&#xff0c;基于字的切分和基于subword的切分。 基于subword的切分是目前的主流切分方式。subword的切分包括: BPE(/BBPE), WordPiece 和 Unigram三种分词模型。其中WordPiece可以认为是一种特殊的BPE。完…

复旦量化多策略公开课总结

《掘金之心公众号&#xff1a;gnu_isnot_unix》前Citadel现自营交易与量化管理&#xff0c;分享热点&#xff0c;主观&#xff0c;量化交易内容。活在当下&#xff0c;终身学习 - 给在职却对未来始终迷茫的人的公众号。借此想告诉不断努力&#xff0c;对生活充满热情的读者们&a…

stm32使用多串口不输出无反应的问题(usart1、usart2)

在使用stm32c8t6单片机时&#xff0c;由于需要使用两个串口usart1 、usart2。usart1用作程序烧录、调试作用&#xff0c;串口2用于与其它模块进行通信。 使用串口1时&#xff0c;正常工作&#xff0c;使用串口2时&#xff0c;无反应。查阅了相关资料串口2在PA2\PA3 引脚上。RX…

简单实现Spring容器(三) 初始化单例池并完成getBean() createBean()方法

阶段3: (仍需打磨,静态处有小瑕疵) // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象. // 2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.3.初始化单例池并完成getBean() createBean()方法思路: 初始化单例池,也就是如果Bean是单例的就实例化,并放入到…

TSOA-TCN-SelfAttention基于凌日优化时间卷积网络融合多头自注意力机制的多特征回归预测程序,还未发表!

适用平台&#xff1a;Matlab2023版及以上 凌日优化算法&#xff08;Transit Search Optimization Algorithm&#xff0c;TSOA&#xff09;是2022年8月提出的一种新颖的元启发式算法&#xff0c;当一颗行星经过其恒星前方时&#xff0c;会导致恒星的亮度微弱地下降&#xff0c;…

SpringData

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

Photoshop Circular Text

Ctrl N 新增 现学现卖

八路达林顿晶体管-ULN2803和ULN2804-笔记

八路达林顿晶体管的介绍 ULN2803示例 BULN2803LV 是专为低压系统设计的大电流达林顿管阵列&#xff0c;电路由八个独立的达林顿管组成&#xff0c;每个达林顿管带有续流二极管&#xff0c;可用于驱动继电器、步进电机等感性负载。单个达林顿管在输入电压低至 1.8V 状态下支持电…

CSS新手入门笔记整理:CSS浮动布局

文档流概述 正常文档流 “文档流”指元素在页面中出现的先后顺序。正常文档流&#xff0c;又称为“普通文档流”或“普通流”&#xff0c;也就是W3C标准所说的“normal flow”。正常文档流&#xff0c;将一个页面从上到下分为一行一行&#xff0c;其中块元素独占一行&#xf…

BUUCTF pwn rip WriteUp

文件分析 下载附件&#xff0c;分析文件 可以看到是64位ELF文件&#xff0c;elf可以理解为Linux中的可执行文件&#xff0c;就像Windows中的exe文件 用ida打开文件 查看main函数的伪代码&#xff0c;可以看到有一个15位的字符数组&#xff0c;该数组通过gets函数传值 还有一…

Ultimate VFX

Ultimate VFX 构建套件:

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

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

Windows11安装使用Oracle21C详细步骤<图文保姆级>新版本

Windows11安装使用Oracle21C详细步骤<图文保姆级>新版本 Database Software Downloads | Oracle 中国 下载完成后解压缩 双击setup.exe 打开安装页面 同意下一步 更改自己的路径点击下一步 输入密码 下一步安装等待即可 等待加载配置时间有点久 完成即可 使用 搜索…

操作系统考研笔记(王道408)

文章目录 前言计算机系统概述OS的基本概念OS的发展历程OS的运行机制OS体系结构OS引导虚拟机 进程和线程进程和线程基础进程进程状态进程控制进程通信线程线程实现 CPU调度调度的层次进程调度细节调度算法评价指标批处理调度算法交互式调度方法 同步与互斥基本概念互斥互斥软件实…

uniapp移动端悬浮按钮(吸附边缘)

Uniapp移动端悬浮按钮可以通过CSS实现吸附边缘的效果。具体实现步骤如下&#xff1a; html&#xff1a; <movable-area class"movable-area"><movable-view class"movable-view" :position"position" :x"x" :y"y"…

仿windows12网盘,私有云盘部署教程,支持多种网盘

仿windows12网盘,私有云盘部署教程&#xff0c;支持多种网盘 资源宝分享&#xff1a;www.httple.net 视频教程&#xff1a;https://www.bilibili.com/video/BV1m64y1G7Bq/ 宝塔部署方式&#xff1a; 1.验证是否安装jdk,没有安装请看安装教程 推荐安装jdk8&#xff08;注意您…

基于JavaWeb+SSM+Vue居住证申报系统小程序的设计和实现

基于JavaWebSSMVue居住证申报系统小程序的设计和实现 源码获取入口KaiTi 报告Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 KaiTi 报告 1.1题目背景 随着时代的发展&#xff0c;人口流动越来越频繁&#xff0…