一种约束Delaunay三角网的并行构建方法与流程

文档序号:12179035阅读:924来源:国知局
一种约束Delaunay三角网的并行构建方法与流程

本发明公开了一种约束Delaunay三角网的并行构建方法,能够实现约束Delaunay三角网的快速构建。



背景技术:

平面离散点的三角剖分并不是一个十分新颖的课题,但是真三维技术的不成熟,同时2维平面任意散点配合属性数据可以很好地建立起地面数字模型,使得平面上的离散点域的三角剖分在地理信息系统GIS地学分析、表面对象重建、有限元分析、公路CAD技术等领域依然有着广泛的应用。按散点域的数据分布特征,其三角剖分可分为无约束三角剖分和约束三角剖分。实际应用中,部分散点之间常常存在约束关系,比如对象重建模型中的边界、地表模型中的山脊线、山谷线、陡崖、湖泊等等,因此加入了约束的三角剖分更加能够反映、模拟真实情况。

电脑硬件发展迅猛,计算性能不断提高,特别是多核处理器的问世与发展,使得并行编程充分利用计算机多核优势成为了科学研究的前沿与热门课题。长期以来,很多程序的开发并没有重视并行处理优化,而是凭借着CPU主频的不断提升而享受运行速度不断加快的“福利”,然而随着技术瓶颈的限制,短期内CPU的主频获得极大提升的可能不大,而且应该充分利用现有的多核处理器,并行运算对程序执行速度的提升在某些情况下又是十分明显的,所以并行编程不断展现出巨大的研究与发展潜力。在海量的地理空间数据的处理任务情况下,并行运算对加快任务处理速度有着重大意义,特别是在加快海量数据处理、实时信息服务生产等领域成为热门话题。

并行最常见的几种方式有数据并行、任务并行、流水线的混合模式。数据并行是在不同数据集下采取相同的操作,任务并行是在相同操作下处理不同的数据,流水线是生产者-消费者模式,任务、数据并行同时存在。负载均衡是指将软件线程的任务分发在多个硬件线程的操作。通过负载均衡可以公平地将工作负载均衡地分配在多个硬件线程之间。均衡的负载可以减少串行数据合并的等待时间,提高程序运行速度。但是现有的并行较少涉及数据的并行划分,并且主要以集群的分布式并行环境为主,单机多核方面的研究有待加强。

约束Delaunay三角网是常见的地理空间数据,具有海量数据的特征,非常有必要结合并行编程技术加快其成网速度以及约束嵌入速度,以适应现代地理信息发展的要求。



技术实现要素:

本发明的目的是提供一种高效的约束Delaunay三角网的并行构建方法,实现Delaunay三角网的构建、约束条件的嵌入,以及约束嵌入的并行计算。

20世纪Delaunay就提出了必定存在一种算法使得构造出的三角网中的三角形最小内角和最大。Delaunay具有以下特性:

(a)空圆性和最大化最小角。三角形最小内角在Delaunay三角网中最大,且做其外接圆没有其他点在外接圆内。

(b)唯一性。对同一离散点集,采用Delaunay三角算法得出的剖分结果应该是唯一的。

(c)局部性。在构网时,添加删除一个点只影响三角网的局部区域。

(d)具有凸壳。Delaunay三角网都具有凸壳,而无视其离散点集的特性。

(e)对偶性。点集的Voronoi图和Delaunay三角剖分是对偶图。

Delaunay三角网的生成算法已经历经了几十年的发展,算法多种多样各具特色,大体上有三类方法——逐点插入法、三角网生长法和分治法,及这几种方法的各种不同实现算法。其中:逐点插入算法在1977年由Lawson提出随后众多学者对其不断改进,这种算法的一般过程是构造凸包,生成初始三角网,逐点插入剩下离散点。先在离散点点集中构造一个凸壳,凸壳可以是三角形或者多边形,一般构造的是多边形,构造方法也多种多样,主要有:卷包裹法、格雷厄姆法(Graham法)、分治法、增量法。然后是生成初始三角网,初始三角网的构造方法有多边形割耳法,或者在凸包内部任意选取一点与凸包各个顶点相连。最后是把剩下的点插入到三角网中,而快速定位点在三角网的哪一个三角形中,又发展出了很多逐点插入算法的变种。当三角网中插入一个新点后检测其是否符合Delaunay三角网特性,对于不符合要求的两个三角形,通过交换两个三角形组成的四边形的对角线即交换边算法来实现三角网的优化,或者是通过确定不符合条件的离散点集的凸包再连接点与凸包的各个顶点来实现优化。

约束Delaunay三角网从实现过程来通常采用的先构建Delaunay三角网,之后嵌入约束的方法。约束条件的嵌入在两步法的实现过程中都需要首先确定影响域,然后嵌入约束。影响域是指在嵌入约束时,约束线段与三角网中的线段相交,包含非约束线段的三角形组成的多边形即为影响域。在嵌入约束的过程中影响域的搜索是起点,只需要将相交的非约束线段消去,约束条件就嵌入到了三角网中。多边形分割算法是将约束边作为多边形的分割线,使得原约束多边形转化成以约束边为公共边的两个新的多边形,然后对这两个多边形进行三角剖分,在影响域内重新构造Delaunay三角网,从而完成约束边的嵌入。

无论是单机多核的共享内存多核系统,还是每个微处理器都有自己私有内存的分布式内存系统,将任务分布在多个可用内核完成工作,就需要并行编程。分析约束Delaunay三角网的串行代码,发现逐点插入数据间的依赖很强,数据在并行难度较大,在嵌入约束时共影响域的部分嵌入多边形是相互影响的,并不能并行,只能将其保持串行。不共影响域的约束嵌入彼此独立,再加上限制很多线程同时执行在表尾插入三角形的并行锁就可以解决数据更新冲突,避免并行出现错误。在并行嵌入约束完成时需要更新三角网,对并行处理的结果进行整理得到最后的处理结果。

本发明将并行计算引入到约束Delaunay三角网的构建中,以全新的思路解决并行约束Delaunay三角网构建中的两个核心问题:

(1)约束Delaunay三角网的构建

约束Delaunay三角网通常采用的先构建Delaunay三角网,之后嵌入约束的方法。因此,需要设计相应的Delaunay三角网生成算法,以及点、线、面、混合对象等的约束嵌入方法。

(2)约束Delaunay三角网的构建算法并行化

并行计算也要根据实际情况采取合适的策略,才能展现出并行的巨大收益,不合适的并行可能效率反而低于串行。在串行代码并行化之前一定要选择可能并行的代码仔细研究,是否是并行热点能不能较为容易地处理数据冲突,不断调优缩减临界区使得并行效率不断提高。

进入大数据时代,快速生成约束Delaunay三角网的技术是值得深入研究优化,其中并行计算是有效途径之一。本发明具有重要的理论与工程实践意义,可以支持约束Delaunay三角网的快速生成。

附图说明

图1 约束Delaunay三角网构建的算法流程

图2 凸壳示意图

图3 Graham扫描法示意图

具体实施方式

本发明设计了约束Delaunay三角网构建的相关算法,选择逐点插入法构建Delaunay三角网,其中凸包构建采用Graham扫描法相对于卷包裹法有着较好的执行效率,嵌入约束采用分部剖分多边形的方法,避免了交换边算法出现的可能的死循环,并行计算上对嵌入约束的非共影响域部分并行化大大缩短了嵌入约束的时间。图1为本发明的算法流程。以下结合幅图,对本发明的约束Delaunay三角网的并行构建的具体实施方式进行详细说明。

步骤1:定义主要对象的数据结构。

步骤1-1:点对象

步骤1-2:线

步骤1-3:三角网

步骤1-4:约束条件

步骤2:离散点生成。离散点是所有工作的起点,离散点应该具有随机性。

步骤3:建立凸壳,图2为凸壳示意图。采用Graham扫描法构建凸壳,图3为Graham扫描法示意图。Graham扫描法要先对离散点集按照极角排序,之后通过维持一个栈来去除凹点得到有序的凸包。

步骤3-1:选取P0点。该点一般是Y坐标最小的点当作基点。如果有多个Y相同的点选择X最小的点,点集中不应包含相同点。

步骤3-2:以P0为极点计算向量(Pi为点集中余下的任意一点)与X轴的夹角,按照夹角的大小对点集排序得到有序点集Q。

步骤3-3:如果集合Q点数小于2不能构造凸壳算法结束,否则进入下一步。

步骤3-4:置空栈S。

步骤3-5:P0、P1和P2入栈,集合Q中余下点每次取一点与次栈顶、栈顶元素做非向左转检测,如果是非向左转就出栈,直到向右转才进栈。点集Q余下元素遍历完成输出栈S即为所求,算法结束。

步骤4:凸壳分割。采用递归割耳法生成初始三角网。

步骤4-1:判断输入点集的存储方向(顺、逆时针)。

步骤4-2:初始化变量P1赋值Pk-1,初始化P2赋值Pk,初始化P3赋值Pk+1(k为点链表中点的编号,1≤k≤n-1)。

步骤4-3:判断点P2的凹凸性,如果为凹则令k=k+1再判断,直到找到显凸性的点。

步骤4-4:判断线段P1P3是否与多边形的任意边相交,如果相交令k=k+1并返回4-3,否则执行下一步。

步骤4-5:将ΔP1P2P3加入三角网。

步骤4-6:将P2点从多边形顶点集中删去,若顶点集只剩下三个点,将这三个点加入三角网算法结束;否则返回4-3。

步骤5:逐点插入法生成Delaunay三角网。

步骤5-1:快速定位点在三角网的哪一个三角形是逐点插入法的基础。

步骤5-2:当三角网中插入一个新点后检测其是否符合Delaunay三角网特性。

步骤5-3:对于不符合要求的两个三角形,通过交换两个三角形组成的四边形的对角线即交换边算法来实现三角网的优化,或者是通过确定不符合条件的离散点集的凸包再连接点与凸包的各个顶点来实现优化。

步骤6:输出DTIN。使用计算机编程语言实现DTIN的可视化。

步骤7:悬挂约束点处理。对于悬挂点,可以将约束点集加入离散点点集中,重新构网,使得约束点中的悬挂点变为非悬挂点,再连接悬挂点,还原约束条件。

步骤8:约束线的嵌入。

步骤8-1:约束多线段是首尾相连的约束线段,与约束多边形相比只是没有闭合,单条约束多线段的嵌入可以转化为多条约束线段的嵌入,在编码时只需要注意增加约束线段标识分别嵌入即可。

步骤8-2:首先扫描约束线段的影响域,提取影响多边形。

步骤8-3:利用约束边将影响多边形分割为两个独立的共线多边形(约束边是共线边),最后利用递归割耳的方法将两个多边形三角剖分并跟新三角网。

步骤9:约束面的嵌入。

步骤9-1:首先是嵌入约束多线段,但是这里的多线段是闭合的多边形。

步骤9-2:判断多边形内部点,凡是有多边形内部点的线段都不在画出,从而消除多边形内部的线段。

步骤10:多约束的嵌入。

步骤10-1:当约束条件不止一个,可能有多个时,就涉及到多约束条件的嵌入了。多约束条件可以是约束线段、约束多线段和约束多边形之间的任意组合,为了区别各个约束条件只需要增加约束点的拓扑关系即可。

步骤10-2:然后将多约束条件转化为单一的约束线段嵌入三角网,最后将约束多边形内部的线段删除即可完成多约束的嵌入。

步骤11:分解原串行流程。在对原串行算法的改写中并非所有的代码或者子任务都能并行,而且并行也有开销,当任务处理数据过少时并行带来的加速收益可能会低于开辟线程的开销,此时就会出现并行甚至慢于串行的后果。

步骤12:寻找并行热点。并行热点是指可并行的串行代码区域,而且这个区域的代码在执行过程中耗时很长,并行计算带来的收益远大于开辟线程的开支。为了避免出现并行反而慢于串行的情况必须找到并行热点,对热点进行并行化才能带来实际收益。

步骤12-1:扫描影响域查找是否有共影响域的边。

步骤12-2:如果有调用改写的串行嵌入约束函数(每次嵌入采用表尾覆写三角网,重构拓扑重扫描影响域,扫描是否有共影响域,直到没有共影响域,然后转到步骤11-3);如果没有直接转到步骤12-3。

步骤12-3:扫描影响域。

步骤12-4:并行嵌入约束。提取并剖分影响多边形,不改变原三角数组的顺序即,当剖分后的三角形数量大于原影响域三角数量时先用剖分的三角形覆盖原三角形,然后将多余的加三角加到数组尾部,并对附加到尾部的操作加上互斥锁;当剖分后的三角形数量小于原来原影响域三角数量时先覆盖,多余部分三角三顶点置0。

步骤12-5:删除三角形数组中三顶点为0的三角形,重构拓扑重扫描影响域(在步骤12-4时已经完成了嵌入,这是为了画多边形重构拓扑),算法结束。

步骤13:处理数据冲突。并行计算的关键就是协调数据冲突,不同的线程对同一内存进行读写是十分危险的,极有可能造成错误,所以在读写公共变量时应该用锁来控制只有一个线程能够进行写的操作。并行编码完成后在对可能的问题进行改进,比如尽可能的减少锁的使用提高并行效率,或者减少临界区(并行代码间的串行代码)减少线程的等待时间。

步骤14:不同规模的随机点和约束,并行、串行算法执行时间效率对比,得出并行算法的加速比。

以上所述仅为本发明的较佳实施例而已,而不用以限制本发明,凡在本发明的精神和原则之内所做的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1