Delaunay三角网表示点和删除算法
约束Delaunay三角网点删除的一体化凸耳消元法(IEE)
Integral Ear Elimination of Vertex Deletion in CD-
TIN
作者: 王彦兵 [1] 吴立新 [1] 贾晓林 [1] 史文中 [2]
作者机构: 中国矿业大学北京校区3S与沉陷工程研究所,北京,100083[1] 香港理工大学LSGI,香港九龙[2]
出版物刊名: 地理与地理信息科学
页码: 31-34页
主题词: 删除 算法 约束Delaunay三角网 TIN 重构 消元法 操作 网点 一体化 法则
摘要:对Delaunay三角网(CD-TIN)点删除算法-凸耳消元法(EE)进行剖析,提出约束Delaunay三角网的点删除算法--体化凸耳消元法(IEE).该算法将CD-TIN的点删除转化为点的影响域重构,并保证重构后的CD-TIN满足CD-TIN的可视性与空圆法则,确保了CD-TIN的拓扑完备性,实现了CD-TIN中约束点与非约束点删除的一体化操作和局部更新,并得到实验验证.。
约束数据域的Delaunay三角剖分算法研究及应用
约束数据域的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三角剖分算法Delaunay三角剖分是一种广泛应用于计算几何和数值分析的算法,它主要用于生成二维平面上的三角形网格。
Delaunay三角剖分具有很多优良的性质,例如空外接圆性质和最小角最大性质等。
上下扫描线的Delaunay三角剖分算法是一种高效的Delaunay三角剖分算法,其基本思想是利用扫描线从上到下或从下到上扫描整个区域,并在扫描过程中对点进行插入和删除操作,从而生成Delaunay三角剖分。
具体步骤如下:
1. 将所有点按照y坐标从大到小排序。
2. 从上到下扫描整个区域,对于每个扫描到的点,将其插入到Delaunay三角剖分中。
具体做法是:找到该点的最近点,然后删除该点,并将该点和最近点之间的线段加入到Delaunay三角剖分中。
3. 重复步骤2,直到扫描完所有点。
该算法的时间复杂度为O(nlogn),其中n为点的数量。
这是因为需要将所有点排序,并且每次插入一个点都需要在已排序的点中进行二分查找。
需要注意的是,该算法只能处理凸多边形的边界,如果存在凹多边形或自相交的情况,需要使用其他算法进行处理。
带内外边界约束的平面点集Delaunay三角剖分
带内外边界约束的平面点集Delaunay三角剖分王中辉;闫浩文【摘要】算法首先将离散点与约束边界点一起进行Delaunay三角剖分,形成初始Delaunay三角网,然后将约束边界上的各条约束线段通过局部更新依次嵌入已有的三角网,最后再删除多余的三角形,从而得到带内外边界约束的平面点集Delaunay三角剖分.%The algorithm first triangulates the scattered points together with the constrained points to form the initial Delaunay triangulation, then each constrained segment in the constrained boundaries is interpolated to the existent triangulation in turn through local updating,finally the redundant triangles are removed, so Delaunay triangulation of a 2-dimension scattered point set with inner and outer boundary constrains is generated.【期刊名称】《兰州交通大学学报》【年(卷),期】2011(030)003【总页数】4页(P120-123)【关键词】内边界约束;外边界约束;Delaunay三角剖分;局部更新;平面点集【作者】王中辉;闫浩文【作者单位】兰州交通大学数理与软件工程学院,甘肃兰州730070;兰州交通大学数理与软件工程学院,甘肃兰州730070【正文语种】中文【中图分类】P2080 引言在众多的平面点集剖分中,Delaunay三角剖分因其优良的性质,已逐渐成为研究应用最广的一种剖分方法[1-2].按平面点集的数据分布特征,Delaunay三角剖分可以分为无约束与约束剖分两种[3].本文研究了带内外边界约束的平面点集Delaunay 三角剖分问题,它在有限元分析、可见性计算、曲面重建等领域均有广泛的应用,但目前关于这方面的算法并不多.简宪华等人通过不断地在约束边界上插入新点(中点)进行Delaunay三角剖分,使得最终所有的约束边界都位于剖分结果的边集中[4].该算法虽然较好地实现了带约束的平面点集Delaunay三角剖分,但在算法过程中由于不断插入新点而改变了原有的数据集.另外,该算法只是研究了内边界约束,对外边界约束并无涉及.针对上述算法中存在的不足,本文提出了一种新的方法,其基本思路是:首先将约束边界点与离散点一起进行Delaunay三角剖分,形成初始Delaunay三角网,然后将约束边界上的各条约束线段通过局部更新依次嵌入已有的三角网,最后再删除多余的三角形,从而得到最终的Delaunay三角网络.1 数据结构本文算法中用到的数据结构定义如下:1.1 点数据结构1.2 边数据结构1.3 三角形数据结构为了节省存储空间以及便于执行查找、插入和删除等操作,算法采用了VisualC++6.0提供的动态数组存储点、边及三角形元素.2 算法描述2.1 算法的主要流程本文算法的主要流程如图1所示.图1 算法流程图Fig.1 The f lowchart of thealgorithm2.2 初始Delaunay三角网的构建本文使用Watson算法[5]构建约束边界点与离散点组成的初始Delaunay三角网,并将生成的三角形顶点按逆时针方向存储,该算法的具体实现步骤可参阅文献[5],此处不再赘述.2.3 约束线段的入网本文算法中约束边界的顶点均按逆时针方向存储,设当前待要入网的约束线段为,约束点和与原始散点构成的初始三角网如图2中虚线部分所示,与相交的三角形组成的区域称为L iL j的三角形影响区域T={T1,T2,T3,T4,T5},而由T中不与相交的三角形的边(即三角形的外围边)组成的多边形称为的影响多边形P= ,如图3所示.Florianil在他的研究中指出P是一简单多边形,约束线段为P的一条对角线,它把P分成PL和PR两部分,且PL和PR也为简单多边形[6].因此可以利用简单多边形的Delaunay三角剖分算法分别对PL和PR进行局部构网,如图4所示.下面详细论述该过程的具体实现方法.2.3.1 影响多边形的构建首先,查找与约束线段相交的所有三角形,并建立由这些三角形的外围边与该约束线段构成的边数组.分两种情况:若该约束线段恰好是三角形的一条边,这种情况不做任何处理;否则,按照下述方法对边数组进行构建,在此结合图2说明这一过程的具体实现步骤:图2 影响三角形Fig.2 Influence triangles图3 影响多边形Fig.3 Influence polygon图4 影响多边形的Delaunay三角剖分Fig.4 Delaunay triangulation of a influence polygon1)从三角形数组中查找与约束线段LiL j相交并且其顶点为的首三角形;2)将当前三角形(如)的外围边与加入到边数组,同时查找与相邻接且与相交的三角形,删除,并将作为当前三角形,重复该过程,直到当前三角形为末三角形为止,将T5的外围边CL j与L jD加入到边数组,并删除;3)将LiL j加入到边数组.接下来,利用边数组构建约束线段的影响多边形PL和PR,并将它们的顶点按逆时针方向存储.由于这两个多边形的构建方法是类似的,因此,下面结合图3以右侧的多边形PR为例说明这一过程的具体实现步骤:1)将约束线段j的起点L i加入到多边形PR的顶点数组;2)在边数组中查找以多边形顶点数组的末元素(假设当前末元素为Li)为起点且终点位于线段右侧的边,并将该边的终点A加入到多边形的顶点数组,重复该过程,直到将所有符合此条件的顶点(依次为A、B、C)加入为止;3)将的终点加入到多边形的顶点数组.2.3.2 影响多边形的Delaunay三角剖分本文使用基于凹凸顶点判定的简单多边形Delaunay三角剖分算法[7]对影响多边形进行局部构网,具体步骤如下:1)按逆时针方向存储多边形的顶点(这在上述构建影响多边形时已处理完),计算出多边形每个顶点的凹凸性;2)对多边形顶点数组中每个凸顶点B,设由其前后顶点A,C组成的三角形为△ABC,若△ABC不包含多边形上其它的顶点,则将其保存到三角形数组中,并从多边形顶点数组中删除顶点B,重新计算受影响的顶点的凹凸性,重复该过程,直到多边形顶点数组为空时结束;3)按最大-最小内角准则,对三角网进行局部优化处理.在上述步骤中,对多边形顶点凹凸性的计算可按如下方法进行:将多边形的顶点按逆时针方向排列,设B(, Y2)为多边形的任意一个顶点,B的前驱顶点为A(),后继顶点为C),按如下公式计算:若其结果大于零则表明顶点B为凸点,反之小于零则为凹点.2.4 多余三角形的删除经过上述步骤后,约束边界已嵌入原有的三角网络中,但在内约束边界内部和外约束边界外部还存在一些多余的三角形,需要将它们删除.删除内(外)约束边界内(外)部三角形的算法步骤如下:1)顺序取出内(外)约束边界上的一条约束线段,设其为AB;如果所有的约束线段都已遍历完,则结束算法;2)查找约束线段AB左(右)侧邻接的△ABC,它是内(外)约束边界内(外)部的三角形,删除以△ABC的非内(外)约束边界为边的所有三角形(包括△ABC),然后转向(1).3 实验结果本文算法已在Visual C++6.0环境下编程实现,原始数据的分布如图5所示,图6为约束边界嵌入后的三角网络,删除多余三角形后的最终剖分结果如图7所示,可以看出该算法生成的三角网符合带约束的Delaunay三角剖分的要求.图5 原始数据Fig.5 Raw data图6 嵌入约束边界Fig.6 Embedding constraint boundaries图7 删除多余三角形Fig.7 Removing redundant triangles4 结束语本文算法通过对三角网的局部更新实现了带内外边界约束的平面点集Delaunay三角剖分,该算法思路简捷,稳定可靠,有一定的实用性.与文献[4]提出的算法相比,时间复杂性均为O(n2),具有相同的运行效率;但本文算法在约束线段入网时并没有增加任何新的数据点,很好地保持了原有数据集的完整性.参考文献:【相关文献】[1] 陈静静,闫浩文,高三营.运用加权Voronoi图进行点集剖分的两种方法[J].兰州交通大学学报,2008,27 (3):154-156.[2] 武晓波,王世新,肖春生.Delaunay三角网的生成算法研究[J].测绘学报,1999,28(1):28-35.[3] 刘学军,龚健雅.约束数据域的Delaunay三角剖分与修改算法[J].测绘学报,2001,30(1):82-88.[4] 简宪华,崔汉国,曹茂春,等.带内边界约束散乱数据的Delaunay三角剖分算法研究[J].计算机工程,2001,27 (5):105-106.[5] W atson D puting the n-dimension delaunay tessellation with application to voronoi po ly topes[J]. Computer Journal,1981,24(2):167-172.[6] Florianii D.An online algorithm for constrained delaunay triangulation[J].CV GIP:G raphical M odels and Image Processing,1992,54(3):290-300.[7] 马小虎,潘志庚,石教英.基于凹凸顶点判定的简单多边形Delaunay三角剖分[J].计算机辅助设计与图形学学报,1999,11(1):1-3.。
基于局部修复的移动数据点Delaunay三角化快速更新方法
基于局部修复的移动数据点Delaunay三角化快速更新方法周元峰;孙峰;王文平;汪嘉业;张彩明【期刊名称】《计算机辅助设计与图形学学报》【年(卷),期】2011(23)12【摘要】Delaunay triangulation;bi-cell;reverse fixing;filtering%在移动数据点Delaunay三角化更新问题中,采用双三角单元过滤算法能够检测出大部分连接关系未发生改变的双三角单元结构,当在算法中出现反转三角单元时,需要重新计算所有数据点的Delaunay三角化.基于以上问题,提出一种具有局部修复的双三角单元过滤算法,通过在局部区域检查三角单元反转并进行修复,避免对所有数据点进行重新Delaunay三角化.实验结果表明,对于三角单元反转出现较多的情况,该算法能够节省约20%~30%的运行时间,提高了原有算法的效率.【总页数】7页(P2006-2012)【作者】周元峰;孙峰;王文平;汪嘉业;张彩明【作者单位】山东大学计算机科学与技术学院济南250101;香港大学计算机科学系香港;香港大学计算机科学系香港;香港大学计算机科学系香港;山东财经大学计算机科学与技术学院济南250014;山东省数字媒体技术重点实验室济南250014;山东大学计算机科学与技术学院济南250101;山东财经大学计算机科学与技术学院济南250014;山东省数字媒体技术重点实验室济南250014【正文语种】中文【中图分类】TP391【相关文献】1.平面多边形域的快速约束Delaunay三角化 [J], 曾薇;孟祥旭;杨承磊;杨义军2.基于快速Delaunay三角化的散乱点曲面重建算法 [J], 杨军;林岩龙;李龙杰;王小鹏3.基于三维Delaunay三角化的快速可视化方法 [J], 李春鑫;彭认灿4.平面域中散乱点的Delaunay三角化算法 [J], 高溪;唐琎5.二维Delaunay三角网局部更新:点插入与点删除 [J], 贾晓林;吴立新;王彦兵因版权原因,仅展示原文概要,查看原文内容请购买。
动态增删点的二维Delaunay三角剖分
动态增删点的二维Delaunay三角剖分王中辉;闫浩文【摘要】在已有算法基础上,利用动态辅助矩形,通过局部更新实现了任意位置、任意顺序的动态增删点的二维Delaunay三角剖钊分,同时给出了详细的数据结构和算法步骤,并在Visual C++ 6.0环境下实现了该算法.算法思路简捷,易于编程,生成的三角网形态优良,符合Delaunay三角形的性质.【期刊名称】《兰州交通大学学报》【年(卷),期】2010(029)006【总页数】5页(P161-165)【关键词】Delaunay三角剖分;动态增点;动态删点;局部更新【作者】王中辉;闫浩文【作者单位】兰州交通大学数理与软件工程学院,甘肃兰州,730070;兰州交通大学数理与软件工程学院,甘肃兰州,730070【正文语种】中文【中图分类】P2080 引言在众多的平面点集三角剖分中,Delaunay三角剖分生成的三角网是最接近于规则化的[1],因此它已成为目前研究应用最广的一种剖分方法.然而现阶段有关这方面的研究成果多是基于离散点数量已知的静态剖分,向已有三角网络中动态增点与删点的Delaunay三角剖分却少有研究[2-4].文献[2]通过求解点集的凸包实现了动态增点的三角剖分,但对凸包边界的修改及点的支撑线的计算增加了该算法的复杂度.文献[3]和文献[4]基于凸耳消元法对数据点进行动态删除,但该方法在删除三角网的边界点时易产生错误的剖分结果.本文在已有算法的基础上设计了具有拓扑关系的数据结构,并通过局部更新实现了点的动态增加和删除.1 数据结构本文算法中用到的数据结构定义如下:1.1 点数据结构用来存放各数据点的坐标.1.2 边数据结构用来存放生成三角网的过程中所用到的边的信息.1.3 三角形数据结构用来存放最终生成的三角形及相互间的拓扑关系.为了便于执行添加、删除及查找等操作,本文算法使用了Visual C++6.0提供的动态数组存放点、边及三角形元素.2 动态增点的Delaunay三角剖分2.1 Watson算法原理Law son逐点插入法在新增一点时需要分点在三角形内和三角形边上两种情况处理,在每插入一点后都需要递归的使用LOP方法对所有的三角形进行优化[5].针对该算法的不足,Watson提出了一种改进的算法,在插入一个点时,只判断它被哪些已存在的三角形外接圆所包含,将这些三角形删除,只保留这些三角形的外边界,形成一个插入多边形,该多边形包含了新插入的点,将新插入的点依次与插入多边形的每个顶点连接,便形成了新的Delaunay三角剖分[6],该过程如图1所示.图1 动态增点的过程Fig.1 The process of dynam ic points addition2.2 动态辅助矩形的构造本文动态增点的算法是在Watson算法的基础上设计的,但有时新增点也可能落在已构建的三角网络之外,如图2a所示,图中实线部分为已有点集的Delaunay三角网络,P为新增点.显然,对于这种情况将无法直接使用上述方法在该点周围形成一个插入多边形进行局部三角剖分.为此,本文算法在对点集进行三角剖分之前构造了一个能够包含所有待加点的辅助矩形,以矩形的4个顶点A、B、C、D作为辅助节点,并将它们与其它数据点一起进行三角剖分,这样便可保证所有的新增点都落在已有三角网络之内,从而使用一致的方法实现动态增点的Delaunay三角剖分.由于在整个构网过程中,矩形的4个顶点都参与了剖分,因此当剖分结束时只需把顶点不是辅助节点的所有三角形输出,便可得到点集最终的Delaunay三角网络,如图2b中的实线部分所示.图2 三角网络外的动态增点Fig.2 The dynam ic points addition outside triangulation net辅助矩形的构造过程如下:1)计算所有待加点的横坐标的最小值X min及最大值,纵坐标的最小值及最大值,以(+K)为左上角顶点,( -K)为右下角顶点构建矩形(其中K为任意正的位移值);2)将该矩形沿任一对角线划分为两个三角形并将它们加入到三角形数组,将矩形的4个顶点加入到点数组,形成初始Delaunay三角网.在后续的增点过程中,若新增点 P(xp,yp)落在辅助矩形之外,即或x或≤或 ,则只需修改相应的、X max、Y max的值,即令:使得该点包含在辅助矩形之内即可.辅助矩形的这种动态构造不会影响原有数据点所形成的三角网,它只是改变了以4个辅助节点为顶点的辅助三角形,如图2中虚线部分所示,而辅助三角形在最后的输出结果中是不出现的.2.3 点的动态增加过程该过程的详细算法步骤描述如下:1)若新增点P落在辅助矩形之外,则利用2.2所述方法动态修改辅助矩形,使点P包含在该辅助矩形之内;2)清空边数组,取三角形数组的第一个元素;3)判断点P是否在该三角形的外接圆内,若不在,转步骤4);否则,在边数组中查找该三角形的每一条边,如果该边已经存在,置它的权值为2,否则置它的权值为1并将其加入到边数组中,删除该三角形;4)若三角形数组没有遍历完,取下一个元素,转步骤3);否则将所有权值为1的边的两端点与新增点P按逆时针方向连接形成的三角形加入到三角形数组中,并调整它们同其它三角形之间的拓扑关系.5)输出顶点不是辅助节点的所有三角形,得到增加新点P后的Delaunay三角网.3 动态删点的Delaunay三角剖分以往算法通常都是基于凸耳消元法对数据点进行动态删除[3-4],但在对三角网的边界点进行删除时,有时会出现错误的剖分结果.如图3b所示,按照凸耳消元法的算法规则,当在该图中删除边界点P的凸耳CDA后,原始点集的剖分结果(图中实线部分所示)出现了错误.由于算法自身的限定,使得凸耳消元法无法正确处理该类问题.本文的做法是:首先将所有与待删除点组成三角形的其它数据点构成一个删除多边形,然后利用多边形的Delaunay三角剖分方法对其进行局部构网,最后输出顶点不是辅助节点的所有三角形,便得到动态删点后的Delaunay三角网.而在对三角网的边界点进行删除时,如图3c所示,首先是查找边界点P的删除多边形ABCD中与辅助节点A相连的两个数据点B、D,然后以它们的连线BD为界将多边形ABCD划分为左右两个多边形PL和PR,分别对它们进行Delaunay三角剖分,便可得到原始点集的正确剖分结果.图3 边界点的动态删除Fig.3 The dynam ic deletion o f boundary points3.1 删除多边形的构造结合图4a,删除多边形的构造过程描述如下:1)根据点与三角形之间的拓扑关系查找与待删除点P关联的任意一个三角形△CDP,并将该三角形的顶点C加入到删除多边形的顶点数组,之后再根据三角形之间的拓扑关系按逆时针方向顺序查找下一个与点P关联的三角形△DEP,并将其顶点D加入到删除多边形的顶点数组,重复此过程,直到下一个要查找的三角形为起始三角形△CDP为止;2)删除数据点P及与其关联的所有三角形,得到顶点按逆时针方向排列的删除多边形CDEFA,如图4b所示.若待删除点是边界点,还应按前述方法将该点的删除多边形划分为两个多边形. 3.2 删除多边形的Delaunay三角剖分本文采用基于凹凸顶点判定的多边形Delaunay三角剖分算法[7]对删除多边形CDEFA进行局部剖分,结果如图4c所示.该过程的主要算法步骤描述如下:1)按逆时针方向存储删除多边形的顶点(这在3.1构建删除多边形时已处理完),计算出删除多边形的凹凸顶点;2)对多边形顶点数组中每个凸顶点B,设由其前后顶点A,C组成的三角形为△ABC,若△ABC不包含多边形上其它的顶点,则将其保存到三角形数组中,并从多边形顶点数组中删除顶点B,重新计算受影响的顶点的凹凸性,重复该过程,直到多边形顶点数组为空时结束;图4 动态删点的过程Fig.4 The process of dynam ic points deletion3)按最大-最小内角准则,对三角网进行LOP优化,得到删除多边形的Delaunay三角剖分,同时调整它们与其它三角形之间的拓扑关系.在上述步骤中,对多边形顶点凹凸性的计算可按如下方法进行:将多边形的顶点按逆时针方向排列,设B(X2, )为多边形的任意一个顶点,B的前驱顶点为,后继顶点为C(X3,Y 3),计算:若其结果大于零则表明顶点B为凸点,反之小于零则为凹点.4 实验结果本文算法已在Visual C++6.0环境下编程实现,实验结果如图5所示.可以看出该算法能够较好地实现动态增删点的Delaunay三角剖分,得到的三角网格符合Delaunay三角形的要求.与文献[2]的方法相比,本文算法思路简捷,降低了算法的复杂度,易于编程实现;与文献[3]和文献[4]相比,本文算法在删除三角网的边界点时,避免了可能的错误剖分结果.图5 动态增点与删点的程序运行结果Fig.5 The program running result of dynam ic points addition and deletion5 结论本文在Watson算法和多边形的Delaunay三角剖分算法基础上,利用动态辅助矩形,通过局部更新实现了任意位置、任意顺序的动态增点与删点算法.经实验证明该方法是行之有效的,具有一定的实际应用价值.由于Voronoi图和Delaunay三角网相互对偶[8],因此本文算法也可以直接应用于对Voronoi图的动态增删点操作. 参考文献:【相关文献】[1] 武晓波,王世新,肖春生.Delaunay三角网的生成算法研究[J].测绘学报,1999,28(1):28-35.[2] 唐泽圣,徐志强.二维点集三角剖分的动态生成与修改[J].计算机辅助设计与图形学学报,1990(3):1-8.[3] 贾晓林,吴立新,王彦兵.二维Delaunay三角网局部更新:点插入与点删除[J].地理与地理信息科学,2004, 20(5):28-31.[4] 孟亮,方金云,贾文涛.二维Delaunay三角网的动态更新[J].计算机应用,2007,27:143-145.[5] Law son C L.Software for C1 surface interpolation. M athematica l SoftwareⅢJ,Rice[M].New York:Academic Press,1977:161-172.[6] W atson D puting the n-dimension delaunay tessellation with application to voronoi po ly topes[J]. Computer Journal,1981,24(2):167-172.[7] 马小虎,潘志庚,石教英.基于凹凸顶点判定的简单多边形Delaunay三角剖分[J].计算机辅助设计与图形学学报,1999,11(1):1-3.[8] 陈静静,闫浩文,高三营.运用加权Voronoi图进行点集剖分的两种方法[J].兰州交通大学学报,2008,27 (3):154-156.。
delaunay三角网生长准则及算法
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(德洛内)三角网 1、定义:一系列相连但不重叠的三角形的集合,而且 这些三角形的外接圆不包含这个面域的其他人任何点。 2、性质:(1)、每个Delaunay三角形的外接圆不包 含面内其他任何点,即Delaunay三角网的空外接圆 性质。这是创建Delaunay三角网的一项判别标准。 (2)、在由点集V中所能形成的三角网中, Delaunay三角网中三角形的最小角度是最大的。
DELAUNAY三角网的算法
一、引言 TIN(Triangulated Irregular Network,不规则三角网)
是由Peuker和他的同事于1978年设计的一个系 统,它是根据区域的有限个点集将区域划分为相等的 三角面网络,数字高程由连续的三角面组成,三角面 的形状和大小取决于不规则分布的测点的密度和位置, 能够避免地形平坦时的数据冗余,又能按地形特征点 表示数字高程特征。TIN常用来拟合连续分布现象的 覆盖表面。
3、优点:结构良好,数据 结构简单,数据冗余度 小,存储效率高,可适 应各种分布密度的数据。
p1
p4
p2 p3
p6
p5
三、Voronoi图 (泰森多边形或Dirichlet图)
由一组由连接两邻点直线的垂直平分线组成的连续多 边形组成。 N个在平面上有区别的点,按照最邻近原则划分平面; 每个点与它的最近邻区域相关联。 Delaunay三角形是由与相邻Voronoi多边形共享一条 边的相关点连接而成的三角形。 Delaunay三角形的外接圆圆心是与三角形相关的 Voronoi多边形的一个顶点。 Voronoi三角形是Delaunay图的偶图 。
3、根据优化准则对局部新形成的三角形进行优化(如互 换对角线等)。将形成的三角形放入Delaunay三角形链 表。 4、循环执行上述第2步,直到所有散点插入完毕。 上述基于散点的构网算法理论严密、唯一性好,网格满足 空圆特性,较为理想。由其逐点插入的构网过程可知,在 完成构网后,增加新点时,无需对所有的点进行重新构网, 只需对新点的影响三角形范围进行局部联网,且局部联网 的方法简单易行。同样,点的删除、移动也可快速动态地 进行。 但在实际应用当中,这种构网算法不易引入地面的地性线 和特征线,当点集较大时构网速度也较慢,如果点集范围 是非凸区域或者存在内环,则会产生非法三角形。
一种快速二维 Delaunay 三角网点定位算法
一种快速二维 Delaunay 三角网点定位算法王雯;吴蔚;苏天赟【摘要】In incremental insertion algorithms of 2D Delaunay triangulation ,seeking out the triangle w hich the inserting point locates in is the key factor influencing the efficiency .In this paper ,point positioning algorithm is improved by avoiding the calculation of gravity center and intersecting edge ,w hich makes the use of geometric properties for triangle barycenter to solve the problem that searching path is too long and complicated to calculate in present algorithms .The experimental results show the algorithm in this paper can shorten the searching path and reduce the time of point positioning process ,ultimately improve the efficiency of delaunay triangulation compared with other present point positioning algorithms .%在构建二维Delaunay三角网的逐点插入法中,定位待插点所在三角形的快慢是影响整个算法构网速度的关键因素。
delaunay 三角剖分 步骤
delaunay 三角剖分步骤1. Delaunay三角剖分是用于将点集分割成不规则三角形的方法。
The Delaunay triangulation is a method for dividing a set of points into irregular triangles.2.首先选择一个点作为起始点。
First, select a point as the starting point.3.然后选择另外两个点与起始点构成一个三角形。
Then select two other points to form a triangle with the starting point.4.接着选择一个未被包含在任何三角形内的点。
Then select a point that is not included in any triangle.5.在所有的三角形中寻找能将这个新点包含进去的三角形。
Find a triangle among all the triangles that can include this new point.6.如果找到了这样的三角形,将这个三角形和新点围成的区域删除。
If such a triangle is found, remove the area enclosed by this triangle and the new point.7.在新的边缘上寻找新的三角形。
Find new triangles on the new edges.8.重复以上步骤,直到所有的点都被包含在三角形内。
Repeat the above steps until all points are included in triangles.9. Delaunay三角剖分具有无重叠、最小化夹角和最大化最小角的性质。
Delaunay triangulation has the properties of non-overlapping, minimizing angles, and maximizing minimum angles.10.可以使用Delaunay三角剖分来进行网格生成和空间分析。
基于三角网生成法的Delaunay三角网生成算法的研究与实现
基于三角网生长法的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三角剖分的几种算法综述
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三角网的并行构建和更新论文三角网是由一系列连续三角形构成的网状的平面控制图形,是三角测量中布设连续三角形的两种主要扩展形式,同时向各方向扩展而构成网状.适用于地势起伏大,通视条件比较好的场地。
以下是店铺为大家精心准备的:浅谈Delaunay三角网的并行构建和更新相关论文。
内容仅供参考,欢迎阅读!浅谈Delaunay三角网的并行构建和更新全文如下:随着测量技术的发展和新型测量设备的出现,空间数据的获取变得更加容易和快捷,与此同时,数据量也呈爆炸性的增长。
如何利用这些海量的空间数据实现数字地面模型DTM 的高效构建是当前空间分析及应用领域亟需解决的问题之一。
Delaunay 三角网以其唯一性、空圆性、能以不同分辨率表达地形、适合各种分布的数据等诸多优点而被广泛地应用于DTM 建模中。
长久以来,国内外学者对Delaunay 三角网的构建提出了多种算法。
这些算法按实现过程大致可以分为三类:逐点插入法、分治法和扫描线法。
陈楚江等提出了实现三角网局部更新的方法。
陈少勤等提出利用多源数据实现不规则三角网的动态更新。
但这些算法都是基于串行程序实现,不支持点并行的插入和删除。
随着多核计算机的普及,并行为解决大数据量的不规则三角网(TIN)构建和更新提供了新的思路。
不少学者也对此做了研究,李坚等提出将分治算法与流数据处理方法相结合,利用多核处理器平台进行并行运算。
张真[7]提出一种适用于并行计算的归并构网方法。
这些算法满足于Delaunay 三角网的并行构建,但不适用于三角网的并行动态更新。
因为在这些算法在开始之前,点集必须是确定的,而三角网更新时,被插入(删除)点是不确定的。
文章提出一种单机多核环境下Delaunay 三角网并行构建算法,该算法将数据进行格网划分,每一个数据块作为一个工作单元。
同时为解决内存共享带来的问题,可以为各工作单元分配独立的内存空间,工作单元之间相对独立,因此可以很好的实现三角网的并行构建和更新。
2D-Delaunay 三角网格的数据结构与遍历
2D-Delaunay三角网格的数据结构与遍历高晓沨1,黄懿2(1.清华大学数学系,北京 100080;南开大学数学科学学院,天津 300071) 摘要:本文总结了二维Delaunay三角网格的Bowyer-Watson自动生成算法及其实现步骤,提出了一种类的结构、函数范例(采用Visual C++ 6.0编写程序),并讨论了遍历三角网格各种方法的优劣性,给出实验数据对比;最后得出结论,用广度优先的遍历方法创建网格是生成三角网格一种相对便利有效率的方法;另外,讨论了初始点加入顺序对程序运行时间的影响。
关键词:Delaunay三角网格 类结构 自动生成 广度优先遍历Data Structure and Traverse of 2D-Delaunay TriangulationGao Xiaofeng1, Huang Yi2(Department of Mathematics ,Tsinghua University; Beijing,100080College of Mathematics, Nankai University, Tianjin, 300071) Abstruct: The article summarized the realization of 2D-Delaunay triangulation, thesteps of creating Bowyer-Watson automatic mesh generator, and then constructed a kindof Class structure as well as functions of this algorithm (using Visual C++ 6.0), andfinally discussed the advantage and disadvantage of different methods to traverse thetriangle mesh, using data examination as contrast. Lastly, the author got theconclusion that Width First Traversal method is more effective and convenient. Besides,we discussed the effect between the order of original point set and running time ofthe program.Key Word: Delaunay Triangulation, Class Structure,automatic generation, Width FirstTraversal1.引言近年来,平面任意点集的三角网格化(triangulation)问题一直是人们密切关注的问题。
Delaunay三角剖分
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三角网剖分成功。
一种基于约束三角网的道路中心线的提取方法
一种基于约束三角网的道路中心线的提取方法李功权;蔡祥云【摘要】鉴于道路中心线应用的广泛性,研究了基于约束Delaunay三角网的道路中心线的提取算法.以道路边界线作为约束线,采用Delaunay方法构建三角网.通过确定相邻三角形的类型,把获取的节点分为3类,其对应道路网络中的十字路、T型路和环岛路,对其分别进行优化处理,从而形成道路的中心线.在给出详细的算法步骤的同时,并用C#语言实现该算法.实测数据应用分析表明,该算法生成的道路中心线符合原道路多边形的形态,保持了原图形的拓扑特征.【期刊名称】《长江大学学报(自然版)理工卷》【年(卷),期】2013(010)002【总页数】4页(P47-50)【关键词】道路中心线;约束Delaunay三角网;道路网络模型【作者】李功权;蔡祥云【作者单位】长江大学地球科学学院,湖北武汉430100【正文语种】中文【中图分类】TP391.4根据道路中心线建立的道路网络模型,充分利用了GIS的网络分析功能,在交通管理和汽车导航中有着广泛的应用。
道路中心线的数据一般无法直接得到,在道路规划设计中可能使用的是道路两边的边界线,城市土地管理部门可能有各个地块的边界信息,这就需要从这些数据中提取道路中心线,而不是去实地人工采集。
如果把需要求取道路中心线的区域看作一个多边形,不是道路的相关空间信息作为约束信息,道路中心线的求取问题就可以转化为多边形骨架线的求取。
所谓骨架线,就是用与原形状连通性和拓扑结构相一致的细曲线作为原对象的一种抽象表示,多边形骨架线的本质是对多边形形状的抽象描述,它反映了多边形的延伸方向和形状特征[1-3]。
在GIS中,面状地理空间对象的分析等很多空间操作都需要提取骨架线[4-6]。
多边形骨架线提取的关键是搜寻多边形内部到边界线上的等距离点集,本质上属于空间邻近分析问题。
一般的骨架线的提取算法有:①数学形态学提取骨架线,这种方法本质是矢量化方法;②最大内切圆盘法,最大圆盘完全落于目标图像内,并且至少有2点与目标边界相切。
Delaunay三角网表示和点删除方法
Abtat s c:Aso e rsna o tag l e rg l e ok【I ,a ul i ua o k d i rc ripo oe,tisu t e r peett n fr n ua dr ua nt r TN) a— r lt n i e ssu t es rp sd hst c r tr i o i t ie r w d cc i l n ltt u r u
Delaunay三角网点定位算法在输电线路设计中的应用
Delaunay三角网点定位算法在输电线路设计中的应用目前山区线路的施工图设计中仍采用人工配置长短腿的方法,作业效率低下。
本文通过引入Delaunay三角网点定位算法,提出长短腿自动配置的设想并编程实现,极大提高了作业效率。
标签:输电线路;长短腿;Delaunay三角网1 引言山区输电线路的设计要求作业人员根据不同的塔基地形进行长短腿配置,人工判读各接腿范围内的高程及动态使工作量非常大。
若引入测绘的数据处理方法,利用计算机技术实现高程信息的自动化读取和配腿工作的程序化表达,则能大大提高作业效率。
2 铁塔长短腿自动配置的核心算法长短腿自动配置的核心算法分两类,一类是DEM重构和任意插入点定位算法,决定软件的工作效率;另一类是长短腿配置算法,决定配置结果的准确性。
2.1 DEM重构算法在数字地形的描述中,不规则三角网模型(简称TIN)是被公认为一种最基本和最重要的DEM模型,TIN是通过离散的数据点生成连续的三角面来逼近真实的地形表面。
由于Delaunay三角网具有空外接圆及最大化最小角的良好性质,被公认为是TIN最优的表达,它数据结构简单,能够对特殊地形进行灵活处理,受到了广泛应用,本软件采用Delaunay三角网对塔基地形离散数据进行DEM重构。
一个三角形只有符合以下两条基本准则才可称为Delaunay三角,准则1:任意一个三角形的外接圆内部不包含其他任何点;准则2:在所有可能形成的三角网中Delaunay三角的最小角度最大。
Delaunay三角网生成算法中比较常用的有三角网生长算法、分治算法、逐点插入算法等。
由于塔基地形的数据量较小(一般不超过7000个点),处理时间均较为快速,本软件进一步研究提升Delaunay三角网生成效率意义并不大,采用经典的三角网生长算法可以满足用户要求。
三角网生长算法的基本描述如下:(1)在离散点序列中任意取一初始点,在剩余点中找出与其相距最近的点,以这两点构建矢量化的初始基线;(2)在初始向量基线的右侧找出与该基线构成Delaunay三角形的第三点,把该点与原来两点连接形成初始化Delaunay三角形,以第三点与基线两端点构建两条新的基线;(3)对上述第2步进行迭代操作,直至离散点集合内所有的点和形成的基线均参与构建Delaunay三角网。
曲线约束Delaunay三角剖分及在地形构建中的应用
曲线约束Delaunay三角剖分及在地形构建中的应用孙劲光;周勃【摘要】针对采用约束Delaunay三角剖分算法构建地形时如何确保地形数据中的曲线约束条件在剖分结果中存在的问题,提出提取能够反映地形自身几何特征的特征点的方法对约束曲线进行直线段逼近,并对允许逼近误差的取值给予分析和验证.实现了使用较少的点对约束曲线进行最大程度逼近;在解决约束直线段不在Delaunay三角割分中的问题时,提出在原约束曲线上进行加特征点细分的方法;针对地形数据量大构网时间长的问题,改进Delaunay三角网格生成算法.实验结果表明算法能够确保约束曲线在网格中存在,提高了对原曲线的逼近程度且提高了运算效率.算法可以实现对复杂区域的正确处理.【期刊名称】《计算机应用与软件》【年(卷),期】2015(032)012【总页数】5页(P25-28,41)【关键词】地形重构;特征点提取;曲线约束Delaunay;离散误差;曲线离散化;Delaunay三角网格【作者】孙劲光;周勃【作者单位】辽宁工程技术大学电子与信息工程学院辽宁葫芦岛125105;辽宁工程技术大学研究生学院辽宁葫芦岛125105【正文语种】中文【中图分类】TP391.14三维空间数据是三维复杂地质对象建模与可视化的主要依据,其中地形数据是地形表面重构的主要数据来源。
由于地形表面复杂且三维空间数据很难获得等原因,导致在实际应用中很难准确地描述地形特征[1]。
因此,人们希望现有三维数据能够尽可能完全地在重构结果中存在。
在众多三角网格生成算法中约束Delaunay三角剖分算法能够更好地体现地形的各种特征从而能够合理表达地表形态,生成的网格质量好,并且地形数据中的点、线、面均可以作为约束条件进行运算。
基于这点原因,在实际应用中多用约束Delaunay三角剖分算法实现地形重构[2,3]。
约束Delaunay三角剖分是指允许在域中加点细分从而使得域的所有边界存在于剖分结果中,并且生成的每个三角形都满足Delaunay准则[4-7]。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0引言对于静态数据三角化(数据点不能动态插入与删除),有许多D-三角网构建算法[1-5];对于动态的点插入,使用逐点插入的方法进行动态局部更新;对于动态的点删除,使用的方法有两种,一是基于凸耳权值的点删除方法[6-7],二是基于空外接圆准则和凸耳性质的点删除方法[8-9],上述两种方法都是基于凸耳删除的方法,存在难以理解或算法效率差的缺点。
本文提出了一种数据结构来存储D-三角网和表现其拓扑关系,对其中的点删除算法进行了改进,可实现D-三角网中数据点的快速删除操作。
1存储结构对于三角格网的存储结构,本文设计了点、有向边的存储表示,三角形的信息在有向边的遍历中隐含,其C++实现如下:Class Point2d {double x,y;}Class Edge {Public:Int num;Edge*next;Edge*prev;Point2d*data;Edge (){data =0;}Edge*Sym (){return (num<1)?this+1:this-1;}Edge*Onext (){return next;}Edge*Oprev (){return prev;}void EndPoints (Point2d*or,Point2d*de ){data =or;Sym ()->data =de;}TwinEdge*Tedge (){return (TwinEdge *)(this -num );}};Class TwinEdge {Private:Edge e [2];Public:TwinEdge (){e [0].num =0;e [0].next =&(e [0]);e [1].num =1;e [1].next =&(e [1]);收稿日期:2007-03-01E-mail :mengl@基金项目:国家863高技术研究发展计划基金项目(2002AA114020、2001AA135210);中国科学院知识创新基金项目(20036020)。
作者简介:孟亮(1968-),男,山西临汾人,博士研究生,研究方向为GIS 、计算机图形学;方金云(1968-),男,山东青岛人,博士,副研究员,研究方向为海量空间数据处理关键支撑技术、网格GIS 等;唐志敏(1966-),男,江苏江阴人,研究员,博士生导师,研究方向为计算机系统结构、网络并行处理。
Delaunay 三角网表示和点删除方法孟亮,方金云,唐志敏(中国科学院计算技术研究所,北京100080)摘要:对于三角网的表示方法,提出了一种双循环链表结构,这种结构能够方便的表示三角网的边拓扑和面拓扑信息,以及多边形结构。
基于这种结构,对三角网点删除算法进行了改进。
以前的点删除算法是基于连续的凸耳删除,提出的方法是基于多边形边的构建方法,利用D-三角网的空外接圆属性。
与其它方法相比,这种方法具有容易理解,效率高的优点。
关键词:Delaunay 三角网;凸耳;点删除;拓扑结构;双循环链表中图法分类号:TP391;P208文献标识码:A文章编号:1000-7024(2008)03-0738-03Delaunay TIN expression and point deletion methodMENG Liang,FANG Jin-yun,TANG Zhi-min(Institute of Computing Technology,Chinese Academy of Sciences,Beijing 100080,China )Abstract :As to representation of triangulated irregular network (TIN ),a dual-circulation linked list structure is proposed,this structure can conveniently express edge and plane topology information of triangulated irregular network,and polygon structure.Based on this structure,improvements are achieved about TIN point deletion algorithm.Previous point deletion algorithm is based on continuous ears deletion,the methods proposed is based on edge construction method of polygon,using Delaunay TIN circumcircle pared with other methods,this method has the advantage of easy understanding,higher efficiency.Key words :Delaunay triangulated irregular network;ears;point deletion;topology structure;dual-circulation linked list2008年2月计算机工程与设计Feb.2008第29卷第3期Vol.29No.3Computer Engineering and Designe [0].prev =&(e [0]);e [1].prev =&(e [1]);}};Edge*MakeEdge (){TwinEdge*q1=new TwinEdge;Return q1->e;}与上相应,三角格网中的一条边由类class TwinEdge 表示,该类中包含两个有向边e [0]和e [1],e [0]和e [1]为同一条边,但方向相反(如图1所示),三角化过程中创建边时均需调用函数MakeEdge (),以确保创建两个有向边,但只返回其中一个,另一个通过调用Sym ()函数获得。
有向边由类class Edge 表示,类成员num 通过函数Sym ()的调用在一条边的两个有向边之间转换,类成员data 指向有向边的源点(如图1中有向边e 的源点由Edata 指示),类成员next 指向同源点逆时针方向的下一个有向边,类成员prev 为同源点逆时针方向的上一个有向边,初始化时next 和prev 均指向自身,所以说该存储方式为对称边双循环链表。
图2为面状图形中给定边e 的边邻接关系,或者说是边拓扑,使用类class Edge 的成员函数,能够较容易的表示上述结构:eLnext =Sym ()->Oprev ();eDprev =Sym ()->Oprev ()->Sym ();eDnext =Sym ()->Onext ()->Sym ();eRprev =Sym ()->Onext ();eOnext =Onext ();eLprev =Onext ()->Sym ();eRnext =Oprev ()->Sym ();eOprev =Oprev ();eSym =Sym ();有向边e 所关联的三角形的边为:e,eLnext,eLprev ;有向边eSym 所关联的三角形的边为:eSym,eOprev (即eSym->eLnext ),eDnext (即eSym->eLprev )。
上述为给定边的面拓扑。
所以说,使用上述数据结构,能够比较容易的表示其边拓扑和面拓扑关系。
2给定结构相关操作对于上述三角网结构,需要在数据点的动态插入和删除过程中维护其拓扑关系,下面简要介绍链表的维护和四边形的构造方法:2.1有向边循环链表的操作有向边a 和有向边b 属同源边,a 边到b 边为逆时针方向(如图3所示),b 边为新建有向边,需插入到同源边链表中,其实现如下:void AppendLink (Edge*a,Edge*b ){Edge*anext =a->Onext ();b->next =anext;a->next =b;anext->prev =b;b->prev =a;}依据图3,类似可定义DeleteLink (Edge*b )函数,其功能为使有向边b 脱离链表。
在动态更新三角网时,需依据有向边来执行删除边的操作,其实现如下:V oid DeleteEdge (Edge*e ){DeleteLink (e );DeleteLink (e->Sym ());Delete e->Tedge ();}2.2四边形的构建应用上述数据结构,主要是在创建边过程中维护边之间的顺序关系。
如图4所示的四边形abcd ,点序列abcd 为逆时针方向,调用函数init (Point2d*a,Point2d*b ,Point2d*c,Point2d*d )构建四边形:Init (Point2d*a ,Point2d*b,Point2d*c,Point2d*d ){Edge*ea =MakeEdge ();ea->EndPoints (a,b );Edge*eb =MakeEdge ();eb->EndPoints (b,c );AppendLink (eb,ea->Sym ());图1对称边双循环链表eeSyneSym->eOnexteSym->eOpreveOpreveOnextEdata 图3有向边循环链表的操作abc abc 删除链插入链abc ab cNext PrevNextPrevEdge*ec =MakeEdge ();ec->EndPoints (c,d );AppendLink (ec,eb->Sym ());Edge*ed =MakeEdge ();ed->EndPoints (d,a );AppendLink (ed,ec->Sym ());AppendLink (ea,ed->Sym ());}由上述创建过程可知,eb =ea->Lnext (),ec =eb->Lnext (),即对于多边形,通过其中一条边(如ea ),应用该类的成员函数Lnext (),可遍历该多边形的各条边。
3D-三角网点删除操作点删除过程,涉及两个主要操作,D 操作确定3点A ,B ,P 是否为逆时针方向,Incircle 操作确定点D 是否位于三角形ABC 的外接圆内,方法如下,Incircle [,)=2222删除点过程是插入点过程的逆过程,由插入点过程可知,欲删除点p (如图5所示)的外围多边形(a1a2..a6)的边均为有效的D-边,满足D-三角网的空圆属性;则对于有效边a1a2,在多边形边上必存在一点a ,使得a1a2a 为逆时针方向(若不满足,如a1a2a3,则其连线a1a3位于多边形的外部),且三角形a1a2a 的外接圆不包含多边形内其它顶点,此三角形a1a2a 为有效的D-三角形。