用c++实现Delaunay三角剖分
Delaunay三角剖分的快速重建算法

潘 荣 丽
山东省 劳动厅 服务 技X 学校 山东 济 南 -
【 要 】 文 描述 了一种D lua 角 剖分 的快 速 重建 算 法 , 以节省 三角 网格 存 储和 传 输 时 摘 本 e ny a 用
间。该算 法 既可 以在 基 于均匀 网格 的D l ny 角化过 程 中, ea a u 直接 生成 点集序 列 , 可 以推广 也 到 其他D lu a _ 角剖分 方 法 的输 出结 果 , e ny a  ̄ 在O( 的时 间 内生成点集 序 列。 简单遍 历这 个 点 n) 集 序列就 可 以在0( ) / 的时 间 内重建D lu a 角 剖分 。 与 以前 的算 法相 比. 算法具 有 重建 ' t e ny a 该 操 作简 单 、 行速度 快 、 执 拓扑信 息 完全 隐藏在 点集 序列 中、 需要增 量插入 操作 等特 点 。 不
的 一 个 重 要 问 题 。 着 广 泛 的应 用 背 景 , 虚 拟 有 在 现 实 、 理 信 息 系统 ( I ) 许 多 方 面都 有 着 很 地 GS 等 重 要 的 意 义 。 实 际 应 用 中经 常 包 含 几 百 万 个 点
和 三 角 形 ,必 须 进 行 数 据 压 缩 才 能 适 应 现 有 的
④ 如 果P 属于 “ ” 洞 的情 况 ( P已经 出现 过 , 不 但
等 于Q. x ̄ rvos , e t . eiu ) 则把 Q移 到Q的末 尾 , n NQ p 输
出标 志
把 数 据点分 布 的平 面区 域划分 成 网格 , 网格 使
单 元数 和 点数 大致 相 同。根 据点 的坐标 值 , 把所 有 的点放 进 相应 的 网格 单 元 中。 靠 近 中间的 网格单 在 元 中找到一 个初 始点 , 然后 找 一个距 离 初 始点最 近 的点 . 把这 两个 顶点 填加 到一 个链 表Q中
约束Delaunay四面体剖分

约束Delaunay四面体剖分作者:张娟来源:《无线互联科技》2017年第12期摘要:文章研究了约束Delaunay四面体网格生成算法,引入了优化的网格算法,提高了四面体剖分单元的质量;重点研究了指定区域的边界边与边界面的一致性这两个Delaunay三角化算法迫切需要解决的关键性问题。
结果表明,文章提出的约束Delaunay三角化算法适用性、效率及网格单元质量等方面都得到了提高,且该算法易于实现。
关键词:约束Delaunay三角化;网格算法;四面体剖分有限元方法是一种解决复杂工程实际问题的有效手段,基于三维实体四面体剖分相对于二维领域的复杂性,Delaunay算法的研究成果还不够完善。
目前Delaunay三角化方法仍具有算法速度慢、稳定性不良、适用范围有限、网格质量较差等和其他三维区域四面体剖分算法一样普遍存在的问题。
Delaunay准则是保证优化的网格结构的前提,由于目前现有的算法都无法较好地保证Delaunay准则,因此导致网格质量无法保证,造成狭长三角形单元的出现,致使误差超出范围,造成算法不稳定性。
而需要解决的最关键的三维Delaunay三角化方法的问题就是指定区域的边界边、边界面的一致性问题。
为了保证指定区域边界的一致性,保证边界边、边界面在Delaunay三角化中的存在性,必须要进行边界的恢复。
1 Delaunay四面体剖分的基本理论—边界一致设Σ是一个三围区域W边界的离散化-曲面网格。
边界一致的问题是要求生成一个符合Σ的四面体网格T,即Σ是一个由Γ元素组成的组合体。
T中可以有额外的点(Steiner点),但是这种点的数目应该被限制得越少越好,这个问题对很多应用软件来说是最基本的。
在三维中,解决这个问题面临很多困难,有一些简单的多面体如果没有Steiner点(40个),就不能被四面体剖分。
判定一个非凸多面体不存在Steiner点能否进行四面体剖分,是NP(NP-complete)问题,Chazelle认为对一个简单的多面体进行四面体剖分可能需要很多Steiner点。
CGAL功能大纲

CGAL功能⼤纲Computational Geometry Algorithms Library,CGAL,计算⼏何算法库。
使⽤C++语⾔编写的,提供⾼效、可控的算法库。
⼴泛应⽤于计算⼏何相关领域,如地理信息系统、计算机图形学、计算机辅助设计、信息可视化系统、⽣物医学等。
CGAL,提供了计算⼏何相关的数据结构和算法,如:(1)三⾓剖分。
2D约束三⾓剖分,2D和3D Delaunay三⾓剖分;(2)Voronoi图。
2D和3D的点,2D加权Voronoi图,分割Voronoi图等;(3)多边形。
布尔运算、偏移、直⾻架等;(4)多⾯体。
布尔运算、2D流型结构、闭合体;(5)曲线(6)⽹格⽣成。
2D Delaunay⽹格⽣成和3D Surface和体积⽹格⽣成;(7)⼏何处理。
表⾯⽹格(Surface Mesh)简化,细分和参数化等;(8)凸壳算法。
适⽤于2D、3D以及dD;(9)搜索结构。
近邻搜索,kd树等;(10)插值(11)形状分析(12)拟合(13)距离算术与代数Arithmetic and Algebra主要提供了计算⼏何⽤到的数学基础:数据类型、多项式、数据结构与算法代数基础Algebraic Foundations这个包从概念、类和函数的⾓度定义了代数对CGAL的意义。
数据类型Number Types这个包为第三⽅数据类型库提供数据类型概念以及数据类型类和包装器类。
模运算Modular Arithmetic这个包提供了有限域的算法。
所提供的⼯具对于基于模块化算法的过滤器和基于余数的算法尤其有⽤。
多项式Polynomial这个包介绍了单变量多项式和多变量多项式的概念。
虽然这个概念是为任意数量的变量编写的,但是对于这个概念的特定模型,变量的数量被认为是固定的。
代数框架Algebraic Kernel解多项式的实解是⼀个应⽤范围很⼴的基本问题。
这个包的⽬标是提供最先进算法的⿊盒实现,以逼近或近似的求解出单变量多项式和双变量多项式的真实根。
基于最小正切值的约束Delaunay三角剖分

基于最小正切值的约束Delaunay三角剖分卢扣;李明峰;管莉莉;陈春晖【摘要】以TIN生长算法和分治算法的思想为基础,提出一种改进的构建约束Delaunay三角网(CDT)的算法.该算法在生长算法和分治算法思想的基础上,以约束边为基边分别向两侧重新构网.以基边与离散点形成的三角形的最小正切值为判断条件确定基点,实现对约束边影响域的三角剖分.实验对比表明该算法减少了搜索基点的时间,提高了构网速度.因此得到最小正切算法优于传统算法的结论.【期刊名称】《南京工业大学学报(自然科学版)》【年(卷),期】2010(032)005【总页数】4页(P96-99)【关键词】约束Delaunay三角网;基边;基点;最小正切值【作者】卢扣;李明峰;管莉莉;陈春晖【作者单位】南京工业大学,土木工程学院,江苏,南京,210009;南京工业大学,土木工程学院,江苏,南京,210009;南京工业大学,土木工程学院,江苏,南京,210009;南京工业大学,土木工程学院,江苏,南京,210009【正文语种】中文【中图分类】TP317不规则三角网 (TI N)具有数据精度高、可局部加密等特点,是数字高程模型的基本形式,在三维可视化、地形分析等领域中有着广泛的应用.在建立TI N的过程中,利用离散点构建 TI N时,不仅对三角形的形状有要求,而且对离散数据自身也有特殊的要求[1].例如,某些点的连线 (跨河大桥、地理边界、断裂线、结构线、河流等)对TI N网的局部合理性有决定性的影响.此时需要考虑对这些离散点加以某种强制约束,使得构成的 TI N符合实际情况,并提高TI N的质量.因此如何在无约束数据的三角网中嵌入约束线段成为研究热点[2].目前,构建约束 Delaunay三角网的方法大致可分为约束图法、分割 -合并算法、加密算法、Shell三角化算法和两步法[3].其中,最具代表性的为两步法.两步法的实质是:首先对约束数据集建立非约束(初始三角网)D-TI N,然后在其中嵌入约束线段并调整初始D-TI N,使得约束线段可见并满足Delaunay三角网的性质[4].Bernal算法是典型的两步法,该算法的基本原理为:先不考虑约束条件构建初始 D-TI N;然后检测约束边所经过的所有三角形,从约束边的起点开始,按照一定规则逐步交换对角线,最终使起始点与目标点相连.该算法的关键是从起始点出发,对遇到的每条对角线进行可交换性判断.可交换则交换,不可交换则判断下一条.第一轮交换结束后,开始下一轮,直到所有约束边均作为三角形边加入到 TI N网中[1].但该算法存在不能动态扩充点集,并且执行效率较低等缺点.因此,笔者在使用生长算法和分治算法的基础上,在建网开始阶段选择以约束边为起始边,基于最小正切值的比较选择三角形的第三点,分别向约束边两侧重新构网,减少三角形第三点的查询时间,以提高算法效率.在向标准的Delaunay三角网中加入约束边后,新的三角网则不再严格满足Delaunay三角网的空外接圆和最小内角和最大这两个性质,只有在网内那些不含约束边的三角形中这两个性质才得到保留.嵌入约束边后的三角网 (约束 Delaunay三角网,简写为 CDT),具有以下性质.设约束Delaunay三角网T(V∶L),V为离散点的集,L为约束边的集合.1)可见性设 Pi、Pj∈V,如果 Pi、Pj的连线不与约束Delaunay三角网中任何三角形边(顶点除外)及L中的任何一条约束边相交,则可称 Pi、Pj是可见的.2)空外接圆性质若三角形 t的三条边不为约束边,则 t为Delaunay三角形,当且仅当 t的外接圆中不含其他 T中三角形的顶点且 t的三顶点是相互可见时,则可称三角形 t满足空外接圆性质.3)最大最小角性质如果两相邻的三角形 t1、t2具有相同的公共边 d且 d∉L,当由t1、t2组成的四边形交换对角线后,其最小内角变成最大时,则称这两个三角形满足最大最小角性质.4)局部优化性质对于三角网 T中的任意三角形 t,如果其三边都不是约束边,则它一定满足空外接圆性质和最大最小角性质,则此三角形满足局部优化性质[5].2.1 算法的基本思想设需要嵌入的约束线段为P1P2P3…Pn(n>2).首先,将约束线段的端点P1P2P3…Pn 加入到离散点集中,构建初始Delaunay三角网.然后,将约束边 PiPj嵌入初始Delaunay三角网中,对初始 Delaunay三角网进行局部调整使之满足约束边 PiPj的均可见性以及三角网的最小角度之和最大,如图 1所示.1)设约束边为 PiPj,删除初始三角网中与约束边 PiPj相交的边,得到一多边形W={Pi、A、B、…、Pj、…、Pi}为空腔多边形[6],约束边 PiPj将多边形W分成了WL和WR两个部分,且WL和WR也是简单多变形,如图 2所示.2)运用最小正切法对WL和WR分别进行三角剖分.3)若Pn∈W,且 Pn与约束边 PiPj所形成的三角形的正数最小正切值和约束边 PiPj 与其他离散点所形成三角形的正数最小正切值相比最大,则该三角形一定满足可见性及最小角之和最大的性质.综上所述,分别对约束线段两侧的空腔多边形WL和WR进行三角剖分,就可实现将约束线段 PiPj嵌入到初始三角网中.2.2 算法步骤1)构建初始Delaunay三角网.初始三角剖分网可利用现存的任一 Delaunay三角剖分算法进行实现,如图 3所示.2)嵌入约束线段 PiPj并删除与约束线段相交的边,形成空腔多边形.连接点 Pi、Pj 并删除与 PiPj相交的线段 BD、CD、AD、AE形便成空腔多边形PiCBAPjEDPi,如图 2所示.3)存储,将空腔多边形在约束线段 PiPj两侧的点分别存入WL和WR两个点集合之中.4)确定起始边,令约束边 PiPj为起始边,连接起始边与相邻的点形成三角形如图 4所示.若连接成的三角形中包含有其他离散点,则该三角形不满足空外接圆性质[7],则不用考虑.5)计算△PiEPj和△PiDPj各角度的正切值,并取出每个三角形的正数最小正切值,即∠DPjPi和∠EPiPj的正切值 (正切值为负数的角度为钝角不可能为最小角).根据正切函数的单调性可知,当-90°<x<90°时,正切值越大,角度越大.因为三角形的最小角小于90°,故正切值最大的角度也应该最大.根据三角网的最大最小角原则[8],可知该三角形即为满足条件的 Delaunay三角形.在本例中∠DPjPi>∠EPiPj,因此ΔPjDPi为满足条件的Delaunay三角形,D为基点,如图 5所示.6)以生成的三角形的边 DPj为起始边通过最小正切算法进行三角剖分.7)约束边右侧的多边形剖分完后,通过最小正切算法对约束边 PiPj左侧多边形进行三角剖分.可得约束Delaunay三角网,如图 6所示.2.3 实例分析在执行效率方面,在最不利的情况下,对角线交换法的边交换次数为 O(n2)[9-10].其中,n为约束边影响域中离散点的个数.基于最小正切值的约束Delaunay三角剖分算法判断次数为 n2-1/4(离散点以约束边为边界均匀分布),n2-3n+2/2(离散点位于约束边的同一侧).由此可见,在建网过程中,此算法减少了搜索基点的时间和三角网局部重建的时间.为验证算法的执行效率和效果,笔者在Visual Studio 2005中实现了最小正切算法和对角线交换法,利用4组不同的数据对最小正切算法和交换对角线算法在相同的计算机环境下进行实验对比.表 1为几组不同点数及约束边数构建三角网所需时间的比较.由表 1可见该算法逻辑清晰、思维严谨、思路简易,且具有较高的执行效率.图7和图 8为本算法的执行效果图.其中,图 7为初始Delaunay三角网,图 8为加入 5条约束边并使用本算法进行剖分后的约束Delaunay三角网.以 TI N生长算法和分治算法的思想为基础,提出基于最小正切值的约束 Delaunay 三角剖分算法.该算法以基边与离散点形成的三角形的最小角的正切值为判断条件来确定基点,实现对约束边的影响域进行三角剖分.在嵌入约束线段的过程中,首先将约束线段影响域中的离散点的数据进行分块存储,在进行三角剖分的过程中只需要在约束边所在的空腔多边形的端点中选择起始点,缩短了搜索基点和三角网局部重新构建的时间,从而快速准确地将初始Delaunay三角网转换成约束 Delaunay三角网.【相关文献】[1] 史文中,吴立新,李清泉,等.三维空间信息系统模型与算法[M].北京:电子工业出版社,2007.[2] 刘学军,龚健雅.约束数据域的Delaunay三角剖分与修改算法[J].测绘学报,2001,30(1):82-88. Liu Xuejun,Gong Jianya.Delaunay triangulation of constrained Data Se[J].Acta Geodaetica et Cartographica Sinica,2001,30 (1):82-88.[3] 邓曙光,刘刚,邹帆.约束数据域 Delaunay算法详述及进展[J].沈阳航空工业学院学报,2005,22(5):79-80. Deng Shuguang,Liu Gang,Zhou Fan.Dilation and evolution of constrained data region Delaunay algorithm[J].Journal of Shenyang Institute of Aeronautcal Engineering,2005,22(5):79 -80.[4] 任振娜,李斌兵,周浩,等.一次性生成约束 Delaunay三角网算法的编程与实现[J].测绘工程,2006,15(1):54-58. Ren Zhenna,Li Binbing,Zhou Hao,et al.The program and achievement of the constrained Delaunay triangulation using once for all generation[J].Engineering ofSurveying and Mapping, 2006,15(1):54-58.[5] 宋占峰,詹振炎,蒲浩.Delaunay三角剖分中嵌入约束边的局部调整算法[J].西南交通大学学报,2002,37(4):399-403. Song Zhanfeng,Zhan Zhenyan,Pu Hao.A local adjustment algorithm for inserting constrained segments in Delaunay triangulation[J]. Journal of Southwest JiaotongUniversity,2002,37(4):399-403.[6] 刘少华.约束数据域Delaunay三角剖分算法研究与应用[J].计算机应用研究,2004,26(3):26-28. Liu Shaohua.A study on algorithm of Delaunay triangulation for the constrained data set and application[J].Application Research of Computers,2004,26(3):26-28.[7] 宋晓宇,戚爱伟,王永会.基于分治策略的快速构建Delaunay三角网算法 [J].沈阳建筑大学学报:自然科学版,2007, 23(5):862-865. Song Xiaoyu,Qi Aiwei,Wang Yonghui.A fast construction algorithm ofDelaunay triangulation based on divide and conquer[J]. Journal of Shenyang Jianzhu University:Natural Science Edition, 2007,23(5):862-865.[8] 熊斌,蒲浩,宋占峰.基于二叉排序树的约束 Delaunay三角网局部调整算法.[J].重庆交通大学学报:自然科学版,2008, 27(2):327-332. XiongBin,Pu Hao,Song Zhanfeng.Local adjustment algorithm for constructing constrained Delaunay triangulation based on binary sorttree[J].Journal of Chongqing Jiaotong University:Natural Science Edition,2008,27(2):327-332.[9] 刘永和,王润怀,齐永安.一种非凸包边界约束不规则三角网生成算法[J].测绘科学,2008,33(3):79-81. Liu Yonghe,Wang Runhuai,Qi Yongan.An algorithm for irregular triangulated networks restricted by non-convex border[J]. Science of Surveying andMapping,2008,33(3):79-81.[10] 宋晓宇,戚爱伟,王永会,等.基于最大外接圆的约束 Delaunay三角剖分算法 [J].沈阳建筑大学学报:自然科学版, 2008,24(6):1095-1098. Song Xiaoyu,QiAiwei,Wang Yonghui,etal.Constrained Delaunay triangulation division algorithm based on maximal circumcircl [J].Journal of Shenyang Jianzhu University:Natural Science E-dition,2008,24(6):1095-1098.。
一种基于格子分块的快速Delaunay三角剖分算法

]
摘
要 介绍 了一种基 于分块格 子构造的快 速 D l n y 面剖分算 法 , 对点 集 以方格为 单位分组 , e ua 平 a 先 每组分别 进行
D l ny e u a 三角 网生成 , a 再把 分组 构成的网格合并成一个 整体 。该算法 易于理解 和实现 , 占用 内存少 , 运算 速度快 , 有近优 具 的线性时 间复杂度 。最后给 出的实例也证 明了算法 的可靠性和实用性 。 关键词 格子分块算法
a) 点 云 以 方格 子 为 单位 分块 对
( 对 每 个 方格 内 点 云 b) D e J a l n y三 角 化
( ) 定 不 需 变 动 f De a C确 l O l una y 三 角形 ( 阴影 部 分 ) 边 界 点 和
图 1 分 块 与合 并 图示
下 面将 对该 算法分 步进 行介 绍 : 第一步, 四叉树划分算 法将初 始点分成 K 按 组 , 后 , 输 入 的文 件 读 出点 的 坐标 , K个 不 之 从 按
同的组写入 K个相应 的文件中( 如图 1a 所示) () 。 第二步, 分别 对 K 个 文件 中 的点 云 数 据 进 行
D lu a 角 网格 构造 ( 图 1 b 所示 ) e ny三 a 如 () 。
收 到 本 文 时 间 :0 6年 3月 2 日 20 3
作者简介 : 陈慧群 , , 士生 , 男 硕 主要从事计算机辅助设 计与制造 、 反求工程等研究 。
些三角形在下面的合并过程中是不需变动的 , 哪些
在 三角 面片连 接 时可 能 要 重 构 的 , 现 的方 法 是 , 实 对 每组来说 , 出 每个 三 角 形 的外接 圆 , 找 如果 这 个 外接 圆至少有一 部分 落在 当前 格子 边界外 , 这个 给
基于Delaunay三角网格剖分算法在三维造型中的研究

基于Delaunay三角网格剖分算法在三维造型中的研究作者:王牌来源:《科学与财富》2014年第06期摘要:在对三维图像进行有限元数值模拟解析时,为了对连续的计算区域进行数值计算,达到模拟仿真的效果,必须先对三维图像进行网格剖分。
Delaunay三角网格剖分算法是生成网格的一种有效方法。
本文介绍了Delaunay三角网格剖分算法,以及在约束条件下的网格细分,最后给出了该算法在三维实体造型中的应用。
关键词:三角剖分;网格生成;网格细分Abstract: In the simulation analysis of the 3D finite element numerical, in order to carry out the numerical calculation for the calculation of continuous area, achieve the simulation results, we must first on the 3D mesh. Delaunay triangulation algorithm is an effective method to generate mesh. This paper introduces the Delaunay triangulation algorithm, and in the condition of mesh subdivision, finally the application of the algorithm in 3D solid modeling are given in this paper.Keywords: triangulation,mesh generation,mesh subdivision1、引言网格生成是有限元模拟计算的先决条件,有限元计算的效率和精确度在很大程度上受生成的网格质量的影响。
cgal tin约束三角形边长
cgal tin约束三角形边长
CGAL(Computational Geometry Algorithms Library)是一个用C++编写的计算几何算法库,它提供了许多用于解决计算几何问题的工具和算法。
在CGAL中,可以使用TIN(三角形不规则网格)来表示地形表面。
TIN约束是指在构建TIN时,对三角形边长进行约束,使得生成的三角形网格满足一定的边长要求。
要在CGAL中对TIN的三角形边长进行约束,首先需要构建一个TIN数据结构,然后可以通过设置约束条件来控制三角形的边长。
在CGAL中,可以使用Delaunay三角剖分算法来构建TIN,并且可以通过设置边长约束条件来控制生成的三角形的大小。
具体来说,可以通过设置三角形的最小和最大边长来约束三角形的大小。
通过调整这些约束条件,可以控制生成的TIN中三角形的大小和形状,从而满足具体的应用需求。
另外,CGAL还提供了丰富的文档和示例,可以帮助开发者更好地理解如何使用TIN约束来控制三角形的边长。
开发者可以参考CGAL的官方文档和示例代码来学习如何使用TIN约束功能。
总之,在CGAL中,可以通过设置TIN约束来控制三角形的边长,从而实现对生成的三角形网格的精细化控制。
希望这些信息能够帮
助你更好地理解如何在CGAL中进行TIN约束三角形边长的操作。
Python实现DelaunayTriangulation
Python实现DelaunayTriangulationDelaunay三角剖分是一种广泛用于计算机图形学、地理信息系统和计算几何等领域的技术。
它将一组离散点集划分成一组互不重叠的三角形,同时满足一定的性质。
在Python中实现Delaunay三角剖分可以使用几何库scipy和matplotlib。
Scipy库中的Delaunay函数可以实现Delaunay三角剖分,而matplotlib库可以用于可视化结果。
下面是一个简单的例子,展示了如何使用Python实现Delaunay三角剖分:```pythonimport numpy as npimport matplotlib.pyplot as pltfrom scipy.spatial import Delaunay#生成随机点points = np.random.rand(30, 2)# 执行Delaunay三角剖分tri = Delaunay(points)# 绘制Delaunay三角剖分结果plt.triplot(points[:,0], points[:,1], tri.simplices)plt.plot(points[:,0], points[:,1], 'o')plt.show```在这个例子中,我们首先生成了30个随机点,然后使用Delaunay函数执行Delaunay三角剖分,并传入这些点作为参数。
最后,使用matplotlib库的triplot函数绘制Delaunay三角剖分结果,然后再绘制原始点。
这段代码可以生成一个简单的Delaunay三角剖分示意图,并且可以通过调整点的数量或位置来实现不同的效果。
实际应用中,Delaunay三角剖分常用于三维地理信息系统中的高程插值、人脸识别中的特征点定位、计算几何中的最近邻等领域。
此外,还可以使用其他几何库,如CGAL和OpenCV等库,来实现更复杂的Delaunay三角剖分算法。
Delaunay三角剖分的几种算法综述
De u a - 剖 分 l ny5 a
约束三 角剖分
、
引 言
D l ny e u a 三角剖 分广泛地应用在 有限元分析 、 a 信息可视化 、 计算机 图形学等领域 。D l ny e u a 三角 网具有 优 良的几 何特性 , a 如空外 圆性 质 、 最 小角最大 的性质等 , 公认的最 优三角 网u 当前 , 是 。 构建三角 网的算 法 可以分为 3 : 类 分治法 、 逐点插 入法和三角 网生长法。分治法 的效 率 最 高 ; 逐点插入法实现简单高效 , 占用内存较小 , 但它 的时 间复杂度差 , 三角网生长法 由于效率 相对较低 , 前采用较少 。约束 D l n y 目 e u a 三 a 角剖分 具 D l ny 慊 e u a 三角剖分的优点 , 广泛应用在地学及计算机领 a 并 域 。De u a 剖分是一种三角剖分 的标准 , l ny a 实现它有多种算法 。 二 、 ea n y D lu a 三角剖分的常见算法 1 a sn . w o 算法 L 逐点插入 的L w o 算法是 L w o 在 17 年提出的 , a sn a sn 9 7 该算法思路简 单, 易于编程实 现。基本原 理为 : 首先 建立一个 大的三角形或 多边形 , 把所有数据点包 围起来 , 向其 中插入一点 , 点与包含它的三角形三个 该 顶点 相连 , 形成 三个新 的三角形 , 后逐个对 它们进行空外 接圆检测 , 然 同时用 L w o 设计 的局部优化 过程 L P 行优化 , as n O进 即通过 交换对角线 的方法来保证所形成 的三角 网为 D lu a 三角 网。 e ny a 上述 基 于散点 的构 网算 法理 论严 密 、 唯一性好 , 网格 满足 空 圆特 性 , 为理想 。由其逐点 插入 的构网过程 可知 , 到非 D l ny 较 遇 ea a 边时 , u 通过删 除调 整 , 可以构造形成新 的 D lu a 边 。在完成 构网后 , eany 增加新 点时 , 无需对所 有的点进行重新构 网, 只需对 新点的影响三角形范 围进 行局部联 网 , 局部联 网的方 法简单易 行。 同样 , 且 点的删除 、 移动也可 快速动态地进行 。但 在实际应用 当中, 当点集较 大时构网速度也较慢 , 如果点集范 围是非 凸区域或者存在 内环 , 则会产生非法三角形 。
基于Delaunay三角剖分的二维交互建模研究
第43卷第2期物探化探计算技术Vol.43No.2 2021年3月COMPUTING TECHNIQUES FOR GEOPHYSIC A L AND GEOCHEMIC A L EXPLORATION Mar.2021文章编号:1001-1749(2021)02-025605基于Delaunay三角剖分的二维交互建模研究杨强(中国石化石油物探技术研究院,南京211103)摘要:准确合理的地质模型是地震正演模拟的基础。
简单的层状结构建模方法无法描述复杂的地质模型的拓扑结构,基于块体的地质建模方法可以描述断层、尖灭、透镜体等多种复杂地质结构,但建模方法实现比较难。
这里提出了一种解决方案,该方法基于Delaunay的地质建模方法,采用带约束的Delaunay三角剖分对复杂模型三角化,在此基础上,以原始线段为索引对剖分结果进行递归查找,形成多边形拓扑结构图和封闭多边形组,再对封闭多边形进行网格化。
通过理论和实际模型,验证了本方法的可行性。
关键词:地震正演;建模;Delaunay三角剖分中图分类号:TP391.41文献标志码:A 0引言地震勘探中,正演模拟不但在地震数据采集中得到应用,在地震资料处理和地震资料解释中也是重要的验证技术手段,是进行地震反演的基础。
而正演模拟的基础就是需要准确且合理的地质模型,因此建模是地震正演的重要基础。
传统上地质模型都沿用Cenveny提出的模型结构,即所谓层状结构模型。
它要求每一个分界面都必须从模型体的左边界贯穿到模型体的右边界,分界面按顺序由上到下依序排列,不得交叉。
对于逆断层、尖灭、透镜体等复杂地层情况,只能人为地简化模型,从而满足层状模型。
在实际的地球物理勘探中,层状结构模型有两个严重不足:①在采集、处理、解释各阶段的模型大都有逆断层、尖灭、透镜体等复杂地质元素,层状结DOI:10.3969/j.issn.1001-1749.2021.02.16构模型无法准确描述复杂的地质拓扑结构,从而无法得到网格化模型;②处理中的叠前深度偏移速度建模以及地震解释构造建模等,都要求能够交互修改模型,交互编辑中的层位修改及移动必须遵循层状规则,这对交互式复杂建模而言很困难,也不便利。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delaunay三角剖分 void main(PointLink *ptUpOutline, PointLink *ptDownOutline) { //首先分别对上下轮廓线的点集进行三角化,ptUpOutline, ptDownOutline为对应点集 TrianglizationInPlan(ptUpOutline) ; TrianglizationInPlan(ptDownOutline) ;
//根据两层三角化的结果进行Delaunay剖分,得到四面体链表 GetTetrahedron( UpTriangle , DownTriangle ) ;
//后处理用于删除不正确的四面体 PostProcess() ; }
其中: 1.函数TrianglizationInPlan()用于平面三角化 void TrianglizationInPlan( PointLink * Head ) { //对不符合Delaunay剖分的边进行细分 bool Over = 1; while( Over ) { First = Head ; Second = First->next ; while( Second ){ if( !NotIncludeOtherPoint( First->Point , Second->Point , Head ) ){ PointLink* Point = new PointLink ; First->next = Point ; Point->next = Second ; Over = false ; } First = Second ; Second = Second->next ; } } //对平面进行三角化,保存结果到TriangleLink的链表 Trianglization( Head ) ; }
2.函数GetTetrahedron()进行Delaunay剖分得到四面体链表 void GetTetrahedron( TriangleLink * First, TriangleLink * Second ) { Cur = First ; while( Cur ){ Temp1 = Cur->Triangle ; Center = GetCenter( Temp1 ) ; Cur = ContourUp ; while( Cur ){ //初始化min if( Cur == ContourUp ) { min = Center.distance( Cur->Point ) ; Value = min ; Result = Cur->Point ; } //找距离最小的点 else { Value = Center.distance( Cur->Point ) ; if( min > Value ){ min = Value ; Result = Cur->Point ; } } Cur = Cur->next ; } TetrahedronLink *T1 = new TetrahedronLink ; T1->volume.Point[0] = Cur->Triangle.Point[0] ; T1->volume.Point[1] = Cur->Triangle.Point[1] ; T1->volume.Point[2] = Cur->Triangle.Point[2] ; T1->volume.Point[3] = Result ; T1->type = 1 ; ResultCur->next = T1 ; T1->next = 0 ; ResultCur = T1 ; Cur = Cur->next ; }
Cur = Second ; while( Cur ){ Temp1 = Cur->Triangle ; Center = GetCenter( Temp1 ) ; //逐个比较找到离圆心最近的点 Cur = ContourDown ; while( Cur ){ //初始化min if( Cur == ContourDown ){ min = Center.distance( Cur->Point ) ; Value = min ; Result = Cur->Point ; } else //找距离最小的点{ Value = Center.distance( Cur->Point ) ; if( min > Value ){ min = Value ; Result = Cur->Point ; } } Cur = Cur->next ; } TetrahedronLink *T2 = new TetrahedronLink ; T2->volume.Point[0] = Cur->Triangle.Point[0] ; T2->volume.Point[1] = Cur->Triangle.Point[1] ; T2->volume.Point[2] = Cur->Triangle.Point[2] ; T2->volume.Point[3] = Result ; T2->type = 2 ; ResultCur->next = T2 ; T2->next = 0 ; ResultCur = T2 ; Cur = Cur->next ; }
EdgeCur1 = EdgeUp ; EdgeCur2 = EdgeDown ; Edge tempEdge1 , tempEdge2 ; while( EdgeCur1 ){ tempEdge1 = EdgeCur1->line ; while( EdgeCur2 ){ tempEdge2 = EdgeCur2->line ; //判断两条边投影是否相交 if( EdgesIntersect( tempEdge1 , tempEdge2 ) ){ TetrahedronLink *T12 = new TetrahedronLink ; T12->volume.Point[0] = tempEdge1.Start ; T12->volume.Point[1] = tempEdge1.End ; T12->volume.Point[2] = tempEdge2.Start ; T12->volume.Point[3] = tempEdge2.End ; T12->type = 12 ; ResultCur->next = T12 ; T12->next = 0 ; ResultCur = T12 ; } EdgeCur2 = EdgeCur2->next ; } EdgeCur1 = EdgeCur1->next ; } }
3.函数EdgesIntersect()两条边投影相交的判断 bool EdgesIntersect(Edge edge1, Edge edge2) { C3DPoint Vector , Vector1 , Vector2 ; C3DPoint Middle = edge1.End + edge1.Start ; Middle.x /= 2 ; Middle.y /= 2 ; Middle.z = edge2.Start.z ; Vector = edge1.End - edge1.Start ; Vector1 = edge2.Start - Middle ; Vector2 = edge2.End - Middle ; if( ( Vector*Vector1 >= 0 && Vector*Vector2 >= 0 ) || ( Vector*Vector1 <= 0 && Vector*Vector2 <= 0 )) return true ; Middle = edge2.End + edge2.Start ; Middle.x /= 2 ; Middle.y /= 2 ; Middle.z = edge1.Start.z ; Vector = edge2.End - edge2.Start ; Vector1 = edge1.Start - Middle ; Vector2 = edge1.End - Middle ; if( ( Vector*Vector1 >= 0 && Vector*Vector2 >= 0 ) || ( Vector*Vector1 <= 0 && Vector*Vector2 <= 0 )) return true ; return false ; }
4.函数PostProcess()用来删除外部四面体 void PostProcess() { TetrahedronLink* Cur = Head ; TetrahedronLink* Pre , * p ; Triangle Temp ; while( Cur ){ switch( Cur->type ) { case 1: Temp.Point[0] = Cur->volume.Point[0] ; Temp.Point[1] = Cur->volume.Point[1] ;