Delaunay三角形构网的分治扫描线算法
约束数据域的Delaunay三角剖分算法研究及应用
![约束数据域的Delaunay三角剖分算法研究及应用](https://img.taocdn.com/s3/m/b0792cd9c9d376eeaeaad1f34693daef5ef71320.png)
约束数据域的Delaunay三角剖分算法研究及应用
刘少华;程朋根;赵宝贵
【期刊名称】《计算机应用研究》
【年(卷),期】2004(021)003
【摘要】研究了一种约束Delaunay 三角网生成算法,它充分利用分治算法与生长算法的优点,对离散点、构网中实时生成的边及三角形采用分块进行网格索引,有效地减少了搜索目标点、边及三角形的时间,从而提高了构网速度,并将该算法用于地面模型的构建中,实现了地形三维可视化.
【总页数】3页(P26-28)
【作者】刘少华;程朋根;赵宝贵
【作者单位】东华理工学院,测量系,江西,抚州,344000;江汉石油学院,湖北,荆州,434023;东华理工学院,测量系,江西,抚州,344000;武汉大学,测绘与遥感信息工程国家重点实验室,湖北,武汉,430079;东华理工学院,测量系,江西,抚州,344000
【正文语种】中文
【中图分类】TP391;P207
【相关文献】
1.约束数据域的Delaunay三角剖分与修改算法 [J], 刘学军;龚健雅
2.带内边界约束散乱数据的Delaunay三角剖分算法研究 [J], 简宪华;崔汉国;曹茂春;高诚;朴成日
3.改进的约束数据域三角剖分算法及应用 [J], 罗斌;李鹤元
4.带地质逆断层约束数据域的Delaunay三角剖分算法研究 [J], 邓曙光;刘刚
5.带岛区约束数据域的Delaunay三角剖分通用算法研究 [J], 邓曙光;陈明;郑智华;唐敏
因版权原因,仅展示原文概要,查看原文内容请购买。
上下扫描线的delaunay三角剖分算法
![上下扫描线的delaunay三角剖分算法](https://img.taocdn.com/s3/m/1da938454b7302768e9951e79b89680203d86bf7.png)
上下扫描线的delaunay三角剖分算法Delaunay三角剖分是一种广泛应用于计算几何和数值分析的算法,它主要用于生成二维平面上的三角形网格。
Delaunay三角剖分具有很多优良的性质,例如空外接圆性质和最小角最大性质等。
上下扫描线的Delaunay三角剖分算法是一种高效的Delaunay三角剖分算法,其基本思想是利用扫描线从上到下或从下到上扫描整个区域,并在扫描过程中对点进行插入和删除操作,从而生成Delaunay三角剖分。
具体步骤如下:
1. 将所有点按照y坐标从大到小排序。
2. 从上到下扫描整个区域,对于每个扫描到的点,将其插入到Delaunay三角剖分中。
具体做法是:找到该点的最近点,然后删除该点,并将该点和最近点之间的线段加入到Delaunay三角剖分中。
3. 重复步骤2,直到扫描完所有点。
该算法的时间复杂度为O(nlogn),其中n为点的数量。
这是因为需要将所有点排序,并且每次插入一个点都需要在已排序的点中进行二分查找。
需要注意的是,该算法只能处理凸多边形的边界,如果存在凹多边形或自相交的情况,需要使用其他算法进行处理。
三维delaunay三角剖分算法
![三维delaunay三角剖分算法](https://img.taocdn.com/s3/m/e2661d76effdc8d376eeaeaad1f34693daef10d7.png)
《三维delaunay三角剖分算法:深度和广度兼具的全面评估》一、介绍三维Delaunay三角剖分算法,又称无缝三角网格生成算法,是计算几何学中一种重要的算法。
它以点云数据为基础,能够快速高效地生成三维空间中的三角剖分,是计算机图形学、计算机辅助设计等领域中常用的重要工具。
二、算法原理和流程1. 点云数据输入三维Delaunay三角剖分算法的输入是一组点云数据,表示了三维空间中的一些离散点,这些点将作为三角剖分的顶点。
2. 建立三角形网格算法首先通过连接这些离散点,构建初始的三角形网格。
根据一定的规则和约束,逐步优化这个初始网格,使其满足一定的性质和条件。
3. 确定Delaunay性质算法的关键是确定Delaunay性质,即任意一个空间中的点集构成的三角剖分,如果其外接圆不含有其他点,则成为Delaunay三角剖分。
通过不断地优化和调整三角形的位置,使得生成的三角剖分满足Delaunay性质。
4. 输出优化后的三角剖分经过多轮优化和调整后,算法会输出一个高质量的Delaunay三角剖分,这个剖分可以用于计算几何中的相关问题和应用。
三、深度探讨三维Delaunay三角剖分算法1. 算法性能的分析三维Delaunay三角剖分算法的性能主要取决于输入的点云数据的规模和分布。
对于规模较大的数据,算法的运行效率可能会有所下降,需要进行合理的优化和加速。
2. 应用领域的广度三维Delaunay三角剖分算法在地质勘探、工程设计、地理信息系统等领域有着广泛的应用。
它能够帮助人们更好地理解和分析三维空间中的复杂结构和关系。
3. 数据结构和算法优化算法的实现和优化涉及到许多数据结构和计算几何的算法技术,需要深入研究和理解这些方面的知识,才能进一步提升三维Delaunay三角剖分算法的性能和效率。
四、总结和回顾三维Delaunay三角剖分算法是一种重要的计算几何算法,它在三维空间中能够高效地生成无缝的三角剖分,具有广泛的应用前景。
Delaunay三角剖分
![Delaunay三角剖分](https://img.taocdn.com/s3/m/513b31c80722192e4436f619.png)
2.没有相交边。(边和边没有交叉点)
3.平面图中所有的面都是三角面.且所有三介面的合集堆散点集V的凸包。
1.2 Delaunay
在实际中运用的鼓多的三角別分是Delaunay三角剖分.它绘一种待殊的三角剖分。先从Delaunay边说起:
【定义】Delaunay边:假设E中的一条边e(两个端点为a,b)> e若满足下列条件.则称Z为Delaunay边:存在一个閲
丄・CvPoint2D32f fp;//This is our point holder//;.^我心点的f•} fIRS)
2・for(i = 0; i < as_many_points_as_you_want; i++ ) {
3・//However you want to set points〃如果我们的点集不足32位的.在这里我们将其转为CvPoint2D32于・如下两种方法.
第//
5.fp=your_32f_point_list[i];
6.cvSubdiv0elaunay2DInsert( subdiv, fp )j
7・}
转换为
1)
2)
肖可以通过输入点(散点集)得到
1.cvCalcSubdivVoronoi2D( subdiv);//Fill out Voronoi data in subdiv〃在subdiv充Vornoi的数州
1.
以下是Delaunay剖分所具备的优异特性:
1x最接近:以掖接近的三点形成三角形.且各线段《三角行的边〉皆不相交。
2.唯一性:不论从区域何处开始构建.最终都将得到一致的结果。
3.眾优性:任惫两个相邻三角形构成的凸四边形的对角线如何可以互换的话.那么两个三角形六个内角屮最小角度不 会变化,
带断层约束的Delaunay三角剖分混合算法
![带断层约束的Delaunay三角剖分混合算法](https://img.taocdn.com/s3/m/d77a5210e97101f69e3143323968011ca300f706.png)
带断层约束的Delaunay三角剖分混合算法张群会;解子毅【摘要】三角剖分是构建高精度数字高程模型(DEM)的基础,在各个领域都有广泛的应用.特别是在约束数据域下的Delaunay三角剖分更具有重大的研究价值,前人已经做了大量的工作,并提出了一系列经典的剖分算法.在对传统算法进行研究与分析后,总结了传统算法的优缺点,结合了逐点插入法、三角网生长法以及分治法的思想,提出了一种高效的、带断层约束的Delaunay三角剖分混合算法.该算法在建立无约束的DT(Delaunay Triangulation,DT)网格的基础上通过嵌入加密后的断层数据来实现带断层约束的CDT(Constrained Delaunay Triangulation,CDT)网格.通过实例比较,说明了混合算法在构网质量和时间效率上都优于传统算法.【期刊名称】《西安科技大学学报》【年(卷),期】2014(034)001【总页数】5页(P52-56)【关键词】Delaunay三角剖分;混合算法;加密;断层约束【作者】张群会;解子毅【作者单位】西安科技大学计算机科学与技术学院,陕西西安710054;西安科技大学计算机科学与技术学院,陕西西安710054【正文语种】中文【中图分类】TP3900 引言目前比较流行的构建数据高程模型(DEM)的方法主要有2种:一种是基于不规则三角形(Triangular Irregular Networks,TIN)网格法,另一种是四边形(GRID)网格法。
和GRID相比,TIN能够精确地表达网格边界和断层,是一种比较理想的三维层面建模方法,在地质层面可视化方面得到了广泛应用。
Delaunay三角剖分法是建立TIN模型最常用的方法。
由于Delaunay三角化满足最小角最大准则和外接圆不包含其他点准则,总是能尽可能避免狭长的三角形,自动向等边三角形逼近,具有网格形态优美等特点。
因此利用Delaunay三角剖分来建立带断层约束的地质模型具有十分重要的价值。
delaunay三角网生长准则及算法
![delaunay三角网生长准则及算法](https://img.taocdn.com/s3/m/ede8fbc0a1c7aa00b52acba2.png)
Delaunay 三角网是Voronoi(或称thiessen多边形,V 图)图的伴生图形◆Delaunay 三角网的定义:由一系列相连的但不重叠的三角形的集合, 而且这些三角形的外接圆不包含这个面域的其他任何点。
◆Voronoi图的定义:Voronoi图把平面分成N 个区,每一个区包括一个点,该点所在的区域是距离该点最近的点的集合。
◆Delaunay三角网的特性:◆不存在四点共圆;◆每个三角形对应于一个Voronoi图顶点;◆每个三角形边对应于一个Voronoi图边;◆每个结点对应于一个Voronoi图区域;◆Delaunay图的边界是一个凸壳;◆三角网中三角形的最小角最大。
空外接圆准则最大最小角准则最短距离和准则在TIN中,过每个三角形的外接圆均不包含点集的其余任何点在TIN中的两相邻三角形形成的凸四边形中,这两三角形中的最小内角一定大于交换凸四边形对角线后所形成的两三角形的最小内角一点到基边的两端的距离和为最小Delaunay三角剖分的重要的准则张角最大准则面积比准则对角线准则一点到基边的张角为最大三角形内切圆面积与三角形面积或三角形面积与周长平方之比最小两三角形组成的凸四边形的两条对角线之比。
这一准则的比值限定值,须给定,即当计算值超过限定值才进行优化Delaunay三角剖分的重要的准则不规则三角网(TIN)的建立●三角网生长算法就是从一个“源”开始,逐步形成覆盖整个数据区域的三角网。
●从生长过程角度,三角网生长算法分为收缩生长算法和扩张生长算法两类。
方法说明方法实例收缩生长算法先形成整个数据域的数据边界(凸壳),并以此作为源头,逐步缩小以形成整个三角网分割合并算法逐点插入算法扩张生长算法从一个三角形开始向外层层扩展,形成覆盖整个区域的三角网递归生长算法逐点插入算法分割合并算法12121212递归生长算法333TIN 建立过程中的几个问题:◆邵春丽.DELAUNAY 三角网的算法详述及其应用发展前景◆鲍蕊娜,等:基于凸壳技术的Delaunay 三角网生成算法研究◆于杰等:Delaunay 三角网构建方法比较研究周围点的提取 点在三角形中的查找 空外接圆判断准则 线段求交问题。
一种高效构建Delaunay三角网的算法
![一种高效构建Delaunay三角网的算法](https://img.taocdn.com/s3/m/ab67536addccda38376baf4a.png)
关 键词 : ea n y三角 网; 据分块 ; O D lu a 数 L P优 化 ; 不规则 三 角 网 中图分 类号 :P3 1 文献标 识码 : 文章编 号 :6 1—7 4 ( 0 0 0 T 1 A 17 17 2 1 ) 2—0 9 1 1—0 5
第 9卷 第 2期
21 0 0年 4月
江 南 大 学 学 报 (自 然 科 学 版 ) J u n l f in n nUnv ri ( au a ce c dt n o r a a g a ie s y N tr l in eE io ) oJ t S i
Vo . No 2 19 .
A i h- f c e y Al o ih fCo t u tng Dea H g Ef inc g r t m o nsr c i l una i ng a i n i y Tra ul tO
SHAN — i n , ZHENG o Xu x a g Ta , LIGe n
me h p rii n,t e tbu l ra g l t d ir g a t r so h s u e s inal tme g st e e s a tto h n i idsti n u a e r e ul rnewo k n t e e s bs t ,f ly i r e h s ting l rn t r ne b ne s q n i ly Th plti t d o h s a g rt ra u a e wo kso y o e ue ta l . e s itng meho ft i l o ihm a c e s h c n de r a e t e s a c c pe o o n sr ma ka l .Th eo mp o e a m c n t uid De a a ra ul to e r h s o fp i t e r b y e us fi r v d Gr ha s a o b l l un yti ng a i n o u bl c n r a e h ro ma c ft l o ih fs b- o k i c e s st e pe f r n e o he ag rt m.Ther s l fo x rme t h wst tt e e u to ure pe i n ss o ha h a g rt m sa ditnc up ro iy i h fi i n y o o tuc i g ir g l rnewo k l o ih ha si ts e i rt n t e efc e c fc nsr tn re u a t r . Ke wor y ds: d l u y ti n ulto e a na ra g a i n, da a e pa tton, ts t rii LOP o i zn ptmii g, ti n u a e ra g l t d
三维空间Delaunay三角剖分算法的研究及应用
![三维空间Delaunay三角剖分算法的研究及应用](https://img.taocdn.com/s3/m/2607b5552379168884868762caaedd3382c4b57a.png)
三维空间Delaunay三角剖分算法的研究及应用一、本文概述随着计算几何和计算机图形学的发展,三维空间Delaunay三角剖分算法已成为一种重要的空间数据处理和分析技术。
本文旨在全面深入地研究三维空间Delaunay三角剖分算法的原理、实现方法以及应用领域。
本文将对三维空间Delaunay三角剖分算法的基本概念和性质进行详细的阐述,包括其定义、性质、特点以及与其他三角剖分算法的比较。
接着,本文将重点探讨三维空间Delaunay三角剖分算法的实现方法,包括增量法、分治法和扫描转换法等,并分析它们的优缺点和适用范围。
本文还将对三维空间Delaunay三角剖分算法在各个领域的应用进行详细的介绍和分析。
这些领域包括计算机科学、地理信息系统、地质学、气象学、生物医学等。
通过具体的应用案例,本文将展示三维空间Delaunay三角剖分算法在实际问题中的应用价值和效果。
本文还将对三维空间Delaunay三角剖分算法的未来发展方向进行展望,探讨其在新技术和新领域中的应用前景和挑战。
本文旨在全面系统地研究三维空间Delaunay三角剖分算法的理论和实践,为其在实际问题中的应用提供有力的支持和指导。
二、三维空间Delaunay三角剖分算法的基本原理Delaunay三角剖分算法是一种广泛应用于二维空间的数据处理算法,它的核心目标是将一组离散的二维点集剖分为一系列互不重叠的三角形,且这些三角形满足Delaunay性质。
简单来说,Delaunay 性质要求任何一个三角形的外接圆内部不包含该三角形之外的任何数据点。
初始化:为每个点分配一个初始的三角形。
这通常是通过连接每个点与它的两个最近邻点来完成的,形成一个初始的三角形网格。
合并三角形:接下来,算法会尝试合并相邻的三角形,以形成更大的三角形。
在合并过程中,算法会检查新形成的三角形是否满足Delaunay性质。
如果满足,则合并成功;如果不满足,则放弃合并,并标记这两个三角形为“已处理”。
delaunay-三角剖分算法
![delaunay-三角剖分算法](https://img.taocdn.com/s3/m/c45b1859b6360b4c2e3f5727a5e9856a561226a4.png)
一、概述Delaunay 三角剖分算法是计算机图形学领域中常用的一种算法,它可以将给定的点集进行高效的三角剖分,用于构建网格、进行地理信息系统分析、建立三维模型等应用。
本文将对该算法的原理、实现和应用进行介绍。
二、算法原理1. 待剖分点集在进行Delaunay三角剖分之前,需要准备一个点集,这个点集是待剖分的对象。
点集的数量取决于具体的应用,可以是二维平面上的点,也可以是三维空间中的点。
2. Delaunay 三角形在进行三角剖分时,Delaunay 三角形是一种特殊的三角形,满足以下性质:a. 任意一个点要么位于Delaunay 三角形的外接圆内部,要么位于外接圆的边上;b. 任意两个Delaunay 三角形之间的外接圆不相交。
3. Delaunay 三角剖分Delaunay 三角剖分是将给定点集进行三角剖分的过程,它的目标是构建满足Delaunay 三角形性质的三角形集合。
三、算法实现1. 基于增量法的实现增量法是Delaunay 三角剖分的一种经典算法,它的基本思想是逐步增加点,并根据Delaunay 三角形的性质进行调整。
具体步骤如下: a. 初始化:选择一个超级三角形包含所有点集,作为初始三角剖分;b. 顺序插入点:逐个将待剖分点插入到当前三角剖分中,并进行调整;c. 边界检测:检测新增的边界是否需要进行修正;d. 优化处理:对新增点周围的三角形进行优化调整。
2. 时间复杂度分析增量法的时间复杂度主要取决于点集的数量和点的分布情况,一般情况下,其时间复杂度可以达到O(nlogn)。
四、算法应用1. 图形渲染在计算机图形学中,Delaunay三角剖分常用于构建网格、进行三维渲染等。
它可以有效地分割空间,使得渲染效果更加真实。
2. 地理信息系统地理信息系统中常常需要对地理数据进行空间分析,Delaunay三角剖分可以帮助构建地理网格,进行地形分析、资源评估等。
3. 三维建模在三维建模领域,Delaunay三角剖分可以用于构建复杂的三维模型,并支持模型的分析、编辑等功能。
基于三角网生成法的Delaunay三角网生成算法的研究与实现
![基于三角网生成法的Delaunay三角网生成算法的研究与实现](https://img.taocdn.com/s3/m/b5753de9aeaad1f346933fa8.png)
基于三角网生长法的Delaunay三角网生成算法***************【摘要】论文简要介绍了Delaunay三角网的性质以及基本生成算法,并重点介绍了三角网生长法的基本原理和算法步骤,并通过设计合理的数据结构,对算法进行实现。
对算法进行分析并提出通过构建格网索引,进一步提高三角网生成效率。
【关键词】三角网生长法扩展TIN 格网索引1.引言数字地形模型DTM(Digital Terrain Model)是指对地形表面形态属性信息的数字表达,是带有空间位置特征和地形属性特征的数字描述[1]。
DTM是GIS的基础数据来源,可用于土地利用现状的分析、合理规划及洪水险情预报等。
DTM地形属性为高程时称为数字高程模型(DEM)。
DEM主要的三种表示模型为规则格网模型、等高线模型、不规则三角网模型(Triangular Irregular Network 简称TIN)。
数字化等高线模型不适合计算坡度或制作地貌渲染图等地形分析,规则格网数据结构简单,计算方便;但存在数据冗余,数据采集较麻烦,难以表达复杂地形等缺陷。
TIN即能够避免平坦地形时数据冗余,也能表达复杂地形,可以根据任意地形特征点表示DEM,因此被广泛应用。
Delaunay三角剖分能最大程度的接近等边三角形,避免狭长三角形,并且能保持三角网的唯一性,使其成为生成TIN的最佳选择。
本论文将简要介绍和比较几种常用的Delaunay三角网生成算法(逐点插入法,三角网生长法,分割合并算法等),并且对三角网生长法算法原理进行研究分析和程序实现。
2.Delaunay三角网的性质Delaunay三角网中的三角形必须满足以下几个性质:(1)空圆特性每一个Delaunay三角形的外接圆不包括Delaunay三角网中的任何其他点。
(2)最大最小角特性在三角剖分中,Delaunay三角网的所有三角形的最小角之和最大。
即使得Delaunay三角形最大程度接近等边三角形。
基于分治算法与逐点插入法的Delaunay三角网建立算法的改进
![基于分治算法与逐点插入法的Delaunay三角网建立算法的改进](https://img.taocdn.com/s3/m/f0313768caaedd3383c4d3c7.png)
化 、 限元 分 析 、 线 选 择 、 学 分 析 、 理 信 息 系 有 路 地 地
统、 虚拟 现 实 、 图 综 合 的领 域 有 着 广 泛 的 应 用 。 地 关于 De u a l n y三角 网建立 的算 法主要 有分 治算 法 、 a 逐点 插入 法 、 角 网生长法 。 三 逐 点 插 入 法 建 立 D lu a ea n y三 角 网 的算 法 思 想 为 : 在包 含所 用 域 内 垫 的 凸包 中建 立 初 始 三 先 角 形 , 后 将 剩 下 的所 有 点 逐 个 插 入 三 角 形 中 , 然 确 保 其 成 为 De u a l n y三 角 网 。 逐 点 插 人 法 的 特 a
中图 分 类 号 :2 8 P0
文献标识码 : A
文 章编 号 :6 2 0 7 2 1 )4 0 4 3 17 —4 9 (0 0 0 一o 1 —0
1 引
言
将对 应 的 4个点 按 逆 时针 方 向组成 一 个链 表 , 构成
初始 凸包 。 ② 将 凸包 上 的每 个 点及 其 后 续 点 按 逆 时 针组
中只剩下 三个 顶 点 , 这 三个 顶 点 连接 起 来 , 初 将 则 始 D lu a ea n y三角 网建立结 束 。
2 2 3 离散 点插 入 ..
复 杂 度 较 大 , 于 大 数 据 量 其 运 行 速 度 将 成 倍 对
增加 。
① 定位三角形— — 找到包含待插点 P的三角形。 ② 根据 三角形 的拓 扑关 系 , 找所 有外 接 圆包 查
第3 3卷第 4 期 21 0 0年 0 7月
Delaunay三角剖分的几种算法综述
![Delaunay三角剖分的几种算法综述](https://img.taocdn.com/s3/m/e1ae2987cc22bcd126ff0c49.png)
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三角剖分的问题
![Delaunay三角剖分的问题](https://img.taocdn.com/s3/m/81d1ed0515791711cc7931b765ce050876327587.png)
Delaunay三⾓剖分的问题最近接触到计算Delaunay三⾓剖分的问题,也算是计算⼏何的⼀个经典问题了。
按照别⼈的算法,也⾃⼰实现了个,发现点集⼤的时候,程序计算起来特慢。
后来分析发现,别⼈程序号称的都是O(nlogn)的,我的却成了O(n*n)的,算法都是⼀样,后来才发现是数据结构的问题,看来程序=算法+数据结构,有道理。
闲着,就整理了些相关知识,组织如下:1.Delaunay三⾓剖分&Voronoi图定义2.计算Delaunay三⾓剖分的算法及分析3.例⼦程序&代码⼤话点集的三⾓剖分(Triangulation),对数值分析(⽐如有限元分析)以及图形学来说,都是极为重要的⼀项预处理技术。
尤其是Delaunay三⾓剖分,由于其独特性,关于点集的很多种⼏何图都和Delaunay三⾓剖分相关,如Voronoi图,EMST 树,Gabriel图等。
Delaunay三⾓剖分有⼏个很好的特性:1.最⼤化最⼩⾓,“最接近于规则化的“的三⾓⽹。
2.唯⼀性(任意四点不能共圆)。
概念及定义⼆维实数域(⼆维平⾯)上的三⾓剖分定义1:假设V是⼆维实数域上的有限点集,边e是由点集中的点作为端点构成的封闭线段, E为e的集合。
那么该点集V的⼀个三⾓剖分T=(V,E)是⼀个平⾯图G,该平⾯图满⾜条件:1.除了端点,平⾯图中的边不包含点集中的任何点。
2.没有相交边。
3.平⾯图中所有的⾯都是三⾓⾯,且所有三⾓⾯的合集就是点集V的凸包。
那什么是Delaunay三⾓剖分呢?不过是⼀种特殊的三⾓剖分罢了。
从Delaunay边说起。
Delaunay边定义2:假设E中的⼀条边e(两个端点为a,b),e若满⾜下列条件,则称之为Delaunay边:存在⼀个圆经过a,b两点,圆内不含点集V中任何的点,这⼀特性⼜称空圆特性。
Delaunay三⾓剖分定义3:如果点集V的⼀个三⾓剖分T只包含Delaunay边,那么该三⾓剖分称为Delaunay三⾓剖分。
约束条件下不规则delaunay三角网构建方法
![约束条件下不规则delaunay三角网构建方法](https://img.taocdn.com/s3/m/a25200e009a1284ac850ad02de80d4d8d15a01fc.png)
约束条件下不规则delaunay三角网构建方法
不规则Delaunay三角网构建是一种在约束条件下构建三角网的方法,它可以有效地构建出满足约束条件的三角网。
首先,需要确定约束条件,即确定三角网中的节点和边的位置。
然后,根据约束条件,使用Delaunay三角剖分算法构建三角网。
Delaunay三角剖分算法是一种基于三角形的空间划分算法,它可以将空间划分为一系列的三角形,使得每个三角形的外接圆内没有其他节点。
这样,就可以构建出满足约束条件的三角网。
最后,需要对构建的三角网进行优化,以满足约束条件。
优化的方法有很多,比如调整节点位置、添加新的节点、删除多余的节点等。
这些优化操作可以使得构建的三角网更加符合约束条件,从而提高三角网的质量。
总之,不规则Delaunay三角网构建是一种在约束条件下构建三角网的有效方法,它可以有效地构建出满足约束条件的三角网,并且可以通过优化操作来提高三角网的质量。
Delaunay三角剖分
![Delaunay三角剖分](https://img.taocdn.com/s3/m/a62809b91a37f111f1855b41.png)
Delauney三角网剖分算法原理:分为三步:一、凸包生成:1)求出如下四点:min(x-y)、min(x+y)、max(x-y)、max(x+y)并顺次放入一个数组,组成初始凸包;2)对于凸包上的点I,设它的后续点为J,计算矢量线段IJ右侧的所有点到IJ的距离,求出距离最大的点K;3)将K插入I,J之间,并将K赋给J;4)重复2,3步,直到点集中没有在IJ右侧的点为止;5)将J赋给I,J取其后续点,重复2,3,4步,当遍历了一次凸包后,凸包生成完成。
二、环切边界法凸包三角剖分:在凸包数组中,每次寻找一个由相邻两条凸包边组成的三角形,在该三角形的内部和边界上都不包含凸包上的任何其他点,然后去掉该点得到新的凸包链表,重复这个过程,最终对凸包数组中的点进行三角剖分成功。
三、离散的内插:1)建立三角形的外接圆,找出外接圆包含待插入点的所有三角形,构成插入区域;2)删除插入区域内的三角形公共边,形成由影响三角形顶点构成的多边形;3)将插入点与多边形所有顶点相连,构成新的Delaunay三角形;4)重复1,2,3,直到所有非凸包上的离散点都插入完为止。
功能实现流程:1. 在绘图菜单栏下添加一个子菜单项为Delauney,并且在工具栏上添加一个工具项。
设置text为Delaunay三角剖分,name为delaunay等属性,添加单击事件,并为单击事件代码2.为事件函数添加如下代码Graphics gra = panel1.CreateGraphics();List<Point_T> pts = new List<Point_T>();foreach (Geometry_T geo in choosegeos.Geofeatures){if (geo.GetType() == typeof(Point_T)){Point_T pt = (Point_T)geo;pts.Add(pt);}}List<Tin> deltins = DelauneyTin(pts);//根据多点构建delauney三角网foreach (Tin tin in deltins){Point[] ctin = new Point[3];for (int i = 0; i < 3; i++){cp = new Point((int)tin.Pthree[i].X, (int)tin.Pthree[i].Y); ctin[i] = cp;}gra.DrawPolygon(Pens.Red, ctin);}3.三角形TIN的数据结构public class Tin{Point_T[] pthree = new Point_T[3];Line_T[] lthree = new Line_T[3];public Line_T[] Lthree{get { return lthree; }set { lthree = value; }}public Point_T[] Pthree{get { return pthree; }set { pthree = value; }}public Tin(){ }public Tin(Point_T p1, Point_T p2, Point_T p3){pthree[0] = p1;pthree[1] = p2;pthree[2] = p3;lthree[0] = new Line_T(p1, p2);lthree[1] = new Line_T(p2, p3);lthree[2] = new Line_T(p3, p1);}}4.圆的数据结构public class Circle_T:Geometry_T{private Point_T cpt;public Point_T Cpt{get { return cpt; }set { cpt = value; }}double radius;public double Radius{get { return radius; }set { radius = value; }}public Circle_T(){ }public Circle_T(Point_T pt, double r){cpt = pt;radius = r;}}5.实现Delaunay三角剖分算法1)public List<Tin> DelauneyTin(List<Point_T> pts)//根据多点构建delauney三角网;分三步:构建凸包;凸包剖分;离散点内插{Graphics gra = panel1.CreateGraphics();List<Tin> deltins = new List<Tin>();List<Point_T> envpts = EnvelopeTin(pts);//构建凸包//for (int i = 0; i < envpts.Count - 1; i++)//{// gra.DrawLine(Pens.Black, new Point((int)envpts[i].X,(int)envpts[i].Y), new Point((int)envpts[i + 1].X, (int)envpts[i + 1].Y));//}//gra.DrawLine(Pens.Black, new Point((int)envpts[0].X, (int)envpts[0].Y), new Point((int)envpts[envpts.Count - 1].X, (int)envpts[envpts.Count - 1].Y));List<Point_T> dispts = new List<Point_T>();//非凸包上的离散点foreach (Point_T pt in pts){if (!envpts.Contains(pt)){dispts.Add(pt);}}List<Tin> envtins = EnvelopeDivision(envpts);//凸包剖分//foreach (Tin tin in envtins)//{// Point[] ctin = new Point[3];// for (int i = 0; i < 3; i++)// {// cp = new Point((int)tin.Pthree[i].X, (int)tin.Pthree[i].Y);// ctin[i] = cp;// }// gra.DrawPolygon(Pens.Blue, ctin);//}deltins = TinInsert(envtins, dispts);//离散点内插return deltins;}2)public List<Point_T> EnvelopeTin(List<Point_T> pts)//构建凸包{List<Point_T> envpts = new List<Point_T>();List<Point_T> othpts = new List<Point_T>();foreach (Point_T pt in pts){othpts.Add(pt);}//构建以x-y,x+y最大最小值组成的初始矩形框CompareXaddY comxandy = new CompareXaddY();CompareXsubY comxsuby = new CompareXsubY();pts.Sort(comxsuby);envpts.Add(pts[0]);envpts.Add(pts[pts.Count - 1]);othpts.Remove(pts[0]);othpts.Remove(pts[pts.Count-1]);pts.Sort(comxandy);if(!envpts.Contains(pts[0])){envpts.Insert(1, pts[0]);}if (!envpts.Contains(pts[pts.Count - 1])){envpts.Add(pts[pts.Count - 1]);}othpts.Remove(pts[0]);othpts.Remove(pts[pts.Count-1]);//构建以x-y,x+y最大最小值组成的初始矩形框int i = 0;int tag = 0;bool over = true;while(i<envpts.Count){Line_T cline;if (i==envpts.Count-1){cline = new Line_T(envpts[i], envpts[0]);}else{cline = new Line_T(envpts[i], envpts[i + 1]);}double dismax=0;for (int j = 0; j < othpts.Count ;j++ ){if (IsLeftPoint(othpts[j], cline)){double distance = PointToLine(othpts[j], cline);if (distance > dismax){dismax = distance;tag = j;over = false;}}}if (over){i++;}else{//envpts.RemoveAt(i);envpts.Insert(i+1, othpts[tag]);over = true;}}return envpts;}public List<Tin> EnvelopeDivision(List<Point_T> pts)//凸包剖分{List<Tin> envtins = new List<Tin>();List<Point_T> cpts = new List<Point_T>();foreach (Point_T pt in pts){cpts.Add(pt);}while (cpts.Count > 2){int tag = 0;double minangle = 120;for (int i = 0; i < cpts.Count; i++){double angle;if (i == 0){angle = CalcuAngle(cpts[cpts.Count - 1], cpts[i], cpts[i + 1]);}else if (i == cpts.Count - 1){angle = CalcuAngle(cpts[i-1], cpts[i], cpts[0]);}else{angle = CalcuAngle(cpts[i-1], cpts[i], cpts[i + 1]);}if ((angle - 60) < minangle){minangle = angle - 60;tag = i;}}int btag=tag-1;int atag=tag+1;if (tag == 0){btag = cpts.Count - 1;}else if (tag == cpts.Count - 1){atag = 0;}Tin ctin = new Tin(cpts[btag], cpts[tag], cpts[atag]);envtins.Add(ctin);cpts.RemoveAt(tag);}return envtins;}public List<Tin> TinInsert(List<Tin> tins, List<Point_T> pts)//离散点内插 {List<Tin> deltins = new List<Tin>();List<Tin> ctins = new List<Tin>();//临时凸包foreach (Tin tin in tins){ctins.Add(tin);}foreach (Point_T pt in pts)//对离散点遍历,内插{List<Point_T> cpts = new List<Point_T>();//临时点集foreach (Tin tin in ctins)//找到外接圆包含离散点的三角形{Circle_T ccir = DelauneyCicle(tin);//构造外接圆if (IsPointInCircle(pt, ccir))//点是否包含在圆内{//for (int i = 0; i < 3; i++)//{// if (!cpts.Contains(tin.Pthree[i]))// {// cpts.Add(tin.Pthree[i]);//记录当前点// }//}deltins.Add(tin); //记录保存当前三角形}}//List<Point_T> ecpts = EnvelopeTin(cpts);//求点集(外接圆包含离散的三角形)的凸包?,接下来,插入点,构建新三角网//for (int j = 0; j < ecpts.Count;j++ )//{// Tin tin;// if (j == ecpts.Count-1)// {// tin = new Tin(ecpts[j], ecpts[0], pt);// }// else// {// tin=new Tin(ecpts[j],ecpts[j+1],pt);// }// ctins.Add(tin);//}List<Line_T> eli = BorderTin(deltins);foreach (Line_T line in eli){Tin tin = new Tin(line.Frompt, line.Topt, pt);ctins.Add(tin);}foreach (Tin tin in deltins)//改变临时三角网(删除deltins保存的三角网){ctins.Remove(tin);}deltins.Clear();}return ctins;}3)public bool IsLeftPoint(Point_T pt, Line_T line)//点在线的左边;叉积大于{bool yes = false;if ((pt.X - line.Frompt.X) * line.ParaA + (pt.Y - line.Frompt.Y) * line.ParaB > 0){yes = true;}return yes;}public double CalcuAngle(Point_T fp, Point_T mp, Point_T tp)//首,中,尾三点构成的夹角{double angle = 0;Point_T vector1 = new Point_T(fp.X - mp.X, fp.Y - mp.Y);Point_T vector2 = new Point_T(tp.X - mp.X, tp.Y - mp.Y);angle = Math.Acos((vector1.X * vector2.X + vector1.Y * vector2.Y) /(Math.Sqrt(vector1.X * vector1.X + vector1.Y * vector1.Y) *Math.Sqrt(vector2.X * vector2.X + vector2.Y * vector2.Y)));return angle;}public Circle_T DelauneyCicle(Tin tin)//构建三角形的外接圆{double x1 = tin.Pthree[0].X;double x2 = tin.Pthree[1].X;double x3 = tin.Pthree[2].X;double y1 = tin.Pthree[0].Y;double y2 = tin.Pthree[1].Y;double y3 = tin.Pthree[2].Y;double x = ((y2 - y1) * (y3 * y3 - y1 * y1 + x3 * x3 - x1 * x1) - (y3 - y1) * (y2 * y2 - y1 * y1 + x2 * x2 - x1 * x1))/ (2 * (x3 - x1) * (y2 - y1) - 2 * ((x2 - x1) * (y3 - y1)));double y = ((x2 - x1) * (x3 * x3 - x1 * x1 + y3 * y3 - y1 * y1) - (x3 - x1) * (x2 * x2 - x1 * x1 + y2 * y2 - y1 * y1))/ (2 * (y3 - y1) * (x2 - x1) - 2 * ((y2 - y1) * (x3 - x1)));Point_T cpt = new Point_T(x, y);double radius=Math.Sqrt(Math.Pow((x1-x),2)+Math.Pow((y1-y),2));Circle_T cir = new Circle_T(cpt,radius);return cir;}public bool IsPointInCircle(Point_T pt, Circle_T cir){if(Math.Sqrt(Math.Pow((pt.X-cir.Cpt.X),2)+Math.Pow((pt.Y-cir.Cpt.Y),2))<cir.Radius) {return true;}elsereturn false;}public List<Line_T> BorderTin(List<Tin> tins){List<Line_T> borli = new List<Line_T>();for (int i = 0; i < tins.Count; i++){for (int t = 0; t < 3; t++){bool tag = false;Line_T cl = tins[i].Lthree[t];for (int j = 0; j < tins.Count; j++){if (j!=i&&IsContainByTin(cl, tins[j])){tag = true;}}if (!tag)borli.Add(cl);}}return borli;}public bool IsContainByTin(Line_T li, Tin tin){for (int i = 0; i < 3; i++){if ((li.Frompt == tin.Lthree[i].Frompt || li.Frompt ==tin.Lthree[i].Topt) && (li.Topt == tin.Lthree[i].Topt || li.Topt ==tin.Lthree[i].Frompt)){return true;}}return false;}6.实现两个排序类CompareXsubY(x-y排序)和CompareXaddY(x+y 排序),仿照CompareX写功能操作步骤:先在面板上绘制多个点;框选部分点;按下实现Delaunay三角网剖分工具,Delaunay三角网剖分成功。
基于GIS的高质量约束Delaunay三角网格剖分
![基于GIS的高质量约束Delaunay三角网格剖分](https://img.taocdn.com/s3/m/07487266561252d380eb6eab.png)
第26卷 第5期2010年9月地理与地理信息科学Geog ra phy and Geo-Infor matio n Science V ol.26 N o.5September 2010收稿日期:2010-04-21; 修订日期:2010-06-10基金项目:国家自然科学基金重点项目(50839001);国家自然科学基金项目(50874021、50779006);辽宁省高等学校科研项目计划(L20100321) 作者简介:赵晓东(1969-),男,博士,教授,从事GIS 在采矿、岩土工程应用和水动模型耦合的研究。
E-mail:xdong.zhao@基于GIS 的高质量约束Delaunay 三角网格剖分赵晓东1,晏小宝1,沈永明2,王 亮2(1.大连大学院士创业园中日地层环境科学研究中心,辽宁大连116622;2.大连理工大学海岸和近海工程国家重点实验室,辽宁大连116023)摘要:在分析现有非结构化网格剖分算法的基础上,提出了一种GIS 支持下的改进分治算法实现约束Delaunay 三角网格剖分。
该方法利用了GIS 的空间拓扑关系对算法输入数据进行预处理,基于三角形的统一数据结构实现了网格细化,对输出剖分网格进行准确的拓扑和约束条件的检查,并基于推进阵面算法思想,结合空间邻近拓扑关系实现了三角剖分节点和网格的重新编号,方便了实际问题中开边界条件的赋值,提高了计算效率。
实例应用表明,该方法大大简化了数值模型非结构化网格剖分的前处理过程,集成了几种综合算法的优点,在保证原分治算法时间复杂度的基础上,提高了约束条件下Delauna y 三角网格生成的质量。
关键词:网格剖分;GIS;约束Delaunay 三角剖分中图分类号:P208 文献标识码:A 文章编号:1672-0504(2010)05-0024-050 引言在应用有限元、有限差分和有限体积法对力学问题进行数值计算的前处理中,网格自动剖分占有重要的位置。
Delaunay三角网格化算法及实现
![Delaunay三角网格化算法及实现](https://img.taocdn.com/s3/m/6f96c866a36925c52cc58bd63186bceb19e8ed15.png)
Delaunay三角网格化算法及实现
管镭;孟宪琦
【期刊名称】《西北工业大学学报》
【年(卷),期】1996(014)001
【摘要】在实践的基础上,探讨了Delaunay三角网格化算法的实现技巧,提出了改进措施。
最后就平面单连通域的Delaunay三角网格化算法及在窑中的应用做了深入的讨论。
【总页数】5页(P138-142)
【作者】管镭;孟宪琦
【作者单位】不详;不详
【正文语种】中文
【中图分类】TP391.41
【相关文献】
1.基于Delaunay三角网格剖分算法在三维造型中的研究 [J], 王牌
2.基于SIFT特征提取与Delaunay三角网格剖分算法在图像匹配中的研究 [J], 徐磊;张强
3.针对路面建模的Delaunay三角网格分治算法 [J], 刘洋;唐好选
4.针对路面建模的Delaunay三角网格分治算法 [J], 刘洋唐好选;
5.一种基于格网划分的高效Delaunay三角网格化算法 [J], 曾闽山;田冬玲;郭吉民因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第36卷 第3期测 绘 学 报Vol.36,No.3 2007年8月ACTA GEODAETICA et CARTO GRAPHICA SINICAAug ,2007 文章编号:100121595(2007)0320358205中图分类号:P208 文献标识码:ADelaunay 三角形构网的分治扫描线算法芮一康,王结臣(南京大学地理信息科学系,江苏南京210093)A N e w Study of Compound AlgorithmB ased on Sw eepline and Divide 2and 2conquerAlgorithms for Constructing Delaunay T riangulationRU I Y i 2kang ,WAN G Jie 2chen(Depart ment of Geographic Inf ormation Science ,N anji ng U niversity ,N anji ng 210093,Chi na )Abstract :As one of the most important DTM model ,Delaunay triangulation is widely applied in manifold fields.A wide variety of algorithms have been proposed to construct Delaunay triangulation ,such as divide 2and 2conquer ,in 2cremental insertion ,trangulation growth ,and so on.The compound algorithm is also researched to construct Delau 2nay triangulation ,and prevalently it is mainly based on divide 2and 2conquer and incremental insertion algorithms.This paper simply reviews and assesses sweepline and divide 2and 2conquer algorithms ,based on which a new com 2pound algorithm is provided after studying the sweepline algorithm seriously.To start with ,this new compound al 2gorithm divides a set of points into several grid tiles with different dividing methods by divide 2and 2conquer algo 2rithm ,and then constructs subnet in each grid tile by sweepline algorithm.Finally these subnets are recursively merged into a whole Delaunay triangulation with a simplified efficient LOP algorithm.For topological structure is im 2portant to temporal and spatial efficiency of this algorithm ,we only store data about vertex and triangle ,thus edge is impliedly expressed by two adjacent triangles.In order to fit two subnets merging better ,we optimize some data structure of sweepline algorithm.For instance ,frontline and baseline of triangulation are combined to one line ,and four pointers point to where maximum and minimum of x axis and y axis are in this outline.The test shows that this new compound algorithm has better efficiency ,stability and robustness than divide 2and 2conquer and sweepline algo 2rithms.Especially if we find the right dividing method reply to different circumstance ,its superiority is remarkable.K ey w ords :Delaunay triangulation ;compound algorithm ;sweepline algorithm ;divide 2and 2conquer algorithm摘 要:Delaunay 三角网作为一种主要的DTM 表示法,具有极其广泛的用途。
基于分治算法和逐点插入法的合成算法是目前研究较多的用于生成Delaunay 三角网的合成算法。
简要介绍和评价扫描线算法和分治算法后,提出一种新的基于这两种算法的合成算法。
该方法兼顾空间与时间性能,稳定性较高,分别较扫描线算法和分治算法,运行效率和鲁棒性更优。
收稿日期:2006206221;修回日期:2007202206基金项目:国家自然科学基金(40401046)作者简介:芮一康(19832),男,江苏溧阳人,研究生,主要从事地理信息系统理论与应用研究。
关键词:Delaunay 三角网;合成算法;扫描线算法;分治算法1 引 言2维平面域内任意离散点集的不规则三角网(TIN 2Triangular Irregular Network )的构建是GIS 数据表达、管理、集成和可视化的一项重要内容,也是地学分析、计算机视觉、表面目标重构、有限元分析、道路CAD 等领域的一项重要的应用技术。
在所有生成TIN 的方法中,Delaunay 三角网最优,它尽可能避免了病态三角形的出现,常常被用来生成TIN 。
Delaunay 三角网是Voronoi 图的直线对偶图,即是连接所有相邻的Voronoi 多边形的生长中心所形成的三角网。
它有以下两条重要性质[1]:空外接圆性质,即由点集所形成的三角网中,每个三角形的外接圆均不包含点集中的其他任意点;最大最小角性质,即由点集所能形成的所有三角网中,Delaunay三角网中三角形的最小内角角度是最大的。
目前常见的构建Delaunay三角网的算法有[2~4]:分治算法,逐点插入算法,生长算法,扫描线算法和凸壳算法。
由于这些算法各有优劣,为了体现各个算法的优势,提高算法在处理大量数据时的时空性能,一个很自然的想法就是将算法综合起来,相互取长补短。
目前研究较多的合成算法是把逐点插入法植入到分治算法中[5~7],该算法编码简易,且有较高的执行效率。
考虑到在上述方法中,扫描线算法较生长、插入等方法具有更好的稳定性和算法复杂度,作为一次研究尝试,本文在研究扫描线算法和分治算法后,提出了分治扫描法,即把扫描线算法和分治法结合起来,以期获得较好的算法性能。
2 分治扫描法Steven Fortune于1987年在Algorithmica上发表了一篇基于平面扫描思想的V2图生成算法的文章[8]。
之后,J.R.Shewchuk等人均按此思路实现了D2三角网的扫描线算法,但各有不同。
此算法主要是把离散点先按某一坐标值(如y 值)排序,然后用一条垂直于该坐标轴的直线扫过点集平面,并在所谓事件点(event points)处停下,处理每种事件,添加三角形,直到完毕。
扫描线算法最坏情况的时间复杂度可达O(N log N),且对内存要求不高。
Lewis和Robinson首先将分治算法思想应用于生成D2三角网[9]。
分治算法的思路是把整个离散点集分割为数个较小的点集,在各个小点集内生成小三角网,然后再逐级合并。
整个过程是一个递归的过程。
L.Guibas和J.Stolfi给出了一个最坏情况下时间复杂度为O(N log N)的算法[10]。
分治算法的优点是时间效率高,但实现较为困难。
由于大量使用递归,内存需求也较大。
与插入法和分治法结合相比,分治扫描算法除了具有良好的执行效率和稳定性外,也很好地解决了插入和分治合成算法子模块的一些“瓶颈”问题,如凸壳计算,因为扫描线算法在局部子网构建的同时也解决了凸壳生成问题。
同时每块子网在优化后可释放部分内存,这为处理大数据量时,提供了一种缓解内存不足的途径。
分治扫描法的基本思路是:划分点集,扫描线法生成子网,子网合并。
其关键过程及实现方法分述如下。
2.1 划分点集分治算法分割子网的通常方案是:当点集内的点数小于一给定的阈值时,生成子网;当点集内的点数超过给定阈值时,如果点域X轴方向的长度大于Y轴方向的长度,则以X轴方向对半分割点集,否者以Y轴方向对半分割点集。
这是一个递归调用的分割过程。
2.2 子网生成2.2.1 扫描法算法的基本步骤子网的生成主要使用扫描线算法。
在三角网数据结构中,拓扑关系的表达最为重要。
拓扑结构的组织关系到算法的执行效率和空间需求。
在这方面有两类经典的数据组织:以边为主体的结构和以三角形为基本的结构。
本方案使用基于三角形结构的数据组织。
这种方案较为节省空间,仅存储顶点和三角形这两种结构,边结构由相邻三角形隐式表达。
每个三角形存储三个顶点的序号,同时存储对应的三个相邻三角形的指针。
此算法主要步骤如下:首先把离散点先按某一坐标值(如Y值)排序,同时建初始三角网,把已生成的三角网的外围分为壳底和前线,壳底和前线的分界是已处理点集中X值最小和最大的点,以此两点为界,所谓下部的折线为壳底,它总是凸壳的一部分,上部的折线即前线,它把已扫描与未扫描的点分开。
然后用一条平行于该坐标轴的直线扫过点集平面,从最新扫入点往前线做垂直于x轴的直线,并在所谓事件点处停下,处理每种事件直到完毕。
点事件流程图如图1所示,分为四种具体的处理情况。
在三角网中每加入一个新的三角形,都要建立与其相邻的三角形之间的拓扑关系,同时更新前线与底壳。