结合二叉树和Graham扫描技术的高效Delaunay三角网构建算法

来源:互联网 发布:python自动化 编辑:程序博客网 时间:2024/05/16 05:16

结合二叉树和Graham扫描技术的高效Delaunay三角网构建算法

 摘 要:为了提高不规则三角网的构建速度,提出了一种高效构建Delaunay三角网算法。首先对平面上的离散点集按一定的阈值进行分块,建立子块索引二叉树,然后利用Graham扫描技术对各子块构建Delaunay三角网,最后自底向上合并具有相同父节点的子块。通过具体实验与其他构网算法比较,该算法在构网速度上具有明显的优越性。
  关键词:二叉树; Delaunay三角网; Graham扫描技术; 数据分块
  
  中图分类号:TP2文献标志码:A
  文章编号:1001-3695(2010)03-0894-03
  doi:10.3969/j.issn.1001-3695.2010.03.023
  
  Efficient algorithm of constructing Delaunay triangulation based on
  binary tree and Graham scanning technique
  
  LI Gen, ZOU Zhi-wen,JU Shi-guang
  (College of Computer, Jiangsu University, Zhenjiang Jiangsu 212013, China)
  
  Abstract:In order to enhance the speed of constructing triangulated irregular network, this paper proposed an efficient algorithm of constructing Delaunay triangulation. Firstly, split the set of discrete points into several subsets with a threshold value and built an index binary tree during that process. Secondly it built Delaunay triangulation on these subsets by Graham scanning technique. Finally, merged the blocks with the same parent node from bottom to top. The result of the experiments shows that the algorithm, compared with other ways, has a distinct superiority in the speed of constructing irregular network.
  Key words:binary tree; Delaunay triangulation; Graham scanning technique; dataset partition
  
  不规则三角网(TIN)是一种表示数字高程模型的方法,它既能够避免地形平坦时的数据冗余,又比网格更能反映原始地形的细节, 而且具有地表重构精度高以及对不规则区域数据点分布适应能力强的特点。Delaunay三角网在这方面表现最为出色,因此常被用于TIN 的生成。Delaunay三角网的实现算法有很多,主要分为三角网生长法、逐点插入法和分治法[1~4]三类。三角网生长法较为简单, 但每次寻找最优点时需要遍历整个点集并比较, 平均时间复杂度为O(n2)[5] ,不适合大数据量的三角网生成;逐点插入法实现较简单、占用内存较小,但在插入新点时需要在三角形链表中搜索包含新点的三角形, 算法的平均时间复杂度为O(n log n), 最坏情况下的时间复杂度为O(n2)[5];分治算法最为高效,构网耗用时间与离散点数量基本成正比[6],由于用递归的方法实现,对内存要求较高,算法相对较复杂。
  刘永和等人[7]提出了一种逐块归并算法,先把平面离散点集划分成若干个子块,再对各子块用三角网扩张法构网,然后对相邻子网合并优化。该算法采用分块的思想使构网时间与点数接近线性关系,但对子网进行分块时没有建立子块的索引,对子网合并时效率不高,且子块中点的数量比较大时,三角网扩张法效率很低。宋晓宇等人[8]在构网时采用Graham扫描法,算法简单易于实现,但是在构网过程中寻找待判断点的可见点时需要对排在该点后面所有的点进行判断,时间复杂度接近O(n2)。郭兆胜等人[9]在构建三角网时结合了分治法和逐点插入法,但子块构建效率不高。石松等人[10]提出了一种基于四叉树分块构建三角网算法,较好地解决了分治算法在构建大数据量不规则三角网时的不足, 总体时间复杂度下降了, 但算法变得较为复杂,不易实现。
  针对上述算法构网时存在的一些不足,本文提出了一种结合二叉树和Graham扫描技术的Delaunay三角网高效构建算法。对于平面上的离散点集,通过对点集的最小外包矩形进行多次分割得到子块集合,在分割过程中伴随着子块索引二叉树的生成;然后利用Graham扫描技术对各子块构建初始三角网再优化成Delaunay三角网;最后从下到上对具有相同父节点的子块进行合并,直到根节点的生成,此时Delaunay三角网构造完成。
  1 数据的二叉树分割
  采用分割—合并算法的前提是对数据进行分割,并能进行高效的搜索,二叉树显然符合这两点。由于点集分布的不均匀性,如何对点集进行分割直接影响后面子集的合并效率。设点集P的最小外包矩形为R〈pl,pr〉。其中pl(x1,y1)、pr(x2,y2)分别为矩形R的左下角点和右上角点。如果R中包含点的个数超过指定的阈值,则对其分割:当(x2-x1)>(y2-y1),则对R进行纵向分割生成左右相等的子块,否则进行横向分割生成上下相等的子块,这样保证分割的子块横向纵向长度相接近。继续对新产生的子块进行分割,依此递推直到所有分割的子块中点的个数在指定的阈值内。最终子块的个数取决于离散点的分布和子块包含点数的阈值。图1为对区域R进行分割产生的子块,子块包含点数的阈值为10,生成的子块索引二叉树如图2所示。
  分割过程中生成的索引二叉树T的每一个节点包含一个矩形区域,父节点的矩形区域是其左右子节点矩形区域的和,左右子节点矩形区域大小相等。父节点的左右子节点包含的矩形区域总是相邻的,因此子块合并时能保证对应区域相邻。二叉树的叶子节点对应最终的分割子块,每个子块包含一定数量的离散点。如果子块中点的个数小于3,则将其与兄弟节点合并形成新的叶子节点。查找点所属的子块就是搜索二叉树叶子节点的过程,根据点是否在节点包含的区域内决定搜索路径,因为二叉树同一层次的节点不包含重叠的区域,所以搜索路径是惟一的,且判断次数不大于二叉树的高度。
  2 Delaunay三角网的构建
  2.1 数据结构
   在Delaunay三角网的构建过程中,数据结构的设计直接影响算法的性能,合理的数据结构不仅能减少数据存储容量,还能提高算法执行效率。本算法定义以下数据结构:
  
  struct Point{//顶点类
  double px; //顶点横坐标  double py; //顶点纵坐标
  };
  struct Edge{//有向边类
  Point * begPt;//边的起点
  Point * endPt;//边的终点
  Triangle * leftTri;//边的左邻三角形
  Triangle * rightTri; //边的右邻三角形
 };
  struct Triangle{//三角形类
  Edge * edge[3]; //三角形的三条边
  Point * pt[3]; //三角形的三个顶点
  };
  为了便于三角形的扩张和拓扑关系的自动构建,边和顶点都按逆时针方向存储,而且点和边有一定的对应关系(图3)。三角形ABC的有向边edge[0]的起点与pt[0]对应,终点与pt[1]对应,同理edge[1]、edge[2]的起点分别对应pt[1]和pt[2],终点分别对应pt[2]和pt[0]。生成一个三角形T时,根据其三个顶点便可以决定相应的三条有向边,且每条边的左邻接三角形就是三角形T。
  
  2.2 利用Graham扫描技术构建各子块三角网
  2.2.1 子块三角网构建算法
  点集区域二叉树分割后,对各叶子节点对应的子块利用Graham扫描技术构建初始三角网。在构网过程中,搜索到待判断点的可见点后将可见点压入凸包顶点集C,新生成的三角形T插入三角形链表,T对应的三条有向边插入有向边链表,同时更新相关有向边对应的右邻接三角形为T。
  定义1 通过Graham 扫描法按照与水平方向夹角对离散点进行排序得到P={p0,p1,p2,…,pn-1},pi为待判断点,线段pipj+1与线段p0pj相交(j>i),当j取最小值时,称pj为pi可见点,pi为pj的被可见点。
  构建子块三角网具体步骤如下:
  a)找出点集中纵坐标值最小点设为p0,将p0与点集中其他点连线求出直线p0pi与水平方向的夹角θi,按θi从小到大的顺序对点的序号进行编号,经过排序后P={p0,p1,p2,…,pn-1}。把p0、p1分别压入凸包顶点集C,索引t初始值为1。
  b)确定C中最后的点为待判断点pi,找到pi的可见点pk,将pk压入C,连接pipi+1,pipi+2,…,pipk,新生成Δp0pipi+1,t加1。
  c)如果t≥k,转步骤d),连接线段ptpt+1,生成新的Δp0ptpt+1和Δptpipt+1,t加1,转步骤c)。
  d)如果C中点的个数小于4,转步骤e),设C中最后三个点分别为pi、pj、pk,如果线段p0pj与pipk相交则pj是凸包顶点,转步骤e);否则将pj从C中删除,连接线段pipk生成新的Δpjpipk,转步骤d)。
  e)如果t  2.2.2 子块构网实例
  下面以点集P为例描述利用Graham扫描技术生成初始三角网的过程,利用Graham 扫描法按照与水平方向夹角对离散点进行排序,得到P={p0,p1,p2,p3,p4,p5,p6},如图4(a)所示。
  
  a)初始情况下,凸包顶点集C={p0,p1},以p1为待判断点,因为线段p1p5与p0p4相交,所以p4为p1的可见点,连接p1p2、p1p3、p1p4,新生成Δp0p1p2,点p4压入C;连接p2p3生成Δp0p2p3和Δp2p1p3;连接p3p4生成Δp0p3p4和p3p1p4(图4(b))。
  b)C={p0,p1,p3},以p4为待判断点搜索到可见点p6,连接p4p5、p4p6新生成Δp0p4p5,点p5压入C;连接p5p6产生新的Δp0p5p6和Δp5p4p6(图4(c))。
  c)C={p0,p1,p4,p6},C中最后三个点分别为p1、p4、p6,因为线段p0p4与p1p6不相交,则判定p4不是凸包顶点,将p4从C中删除;连接p1p6,新生成Δp4p1p6。C中点的个数为3,结束判断,最后得到凸包顶点C={p0,p1,p6},初始三角网如图4(d)所示。
  2.2.3 子网优化
  利用Graham扫描技术构建的子三角网并不完全符合Delaunay三角网的两个性质,即空外接圆特性以及最小角最大原则,需要对子三角网进行优化。根据上文设计的数据结构,有向边存储了左右邻接三角形,因此以有向边为单位进行子网优化更为高效。
  子网优化方法是判断有向边的左右邻接三角形的对角之和是否大于180°(图5),如果是则满足性质;否则交换对角线,生成新的两个三角形插入三角形链表,有向边插入有向边链表,删除原来的有向边和三角形,同时更新相关有向边指向的邻接三角形。
  2.3 基于二叉树的子网合并
  子网合并从二叉树的叶子节点开始自底向上合并,具有相同父节点的叶子节点合并后生成新的节点取代其父节点,于是合并后新生成的节点成了叶子节点。重复上述合并过程直到二叉树的根节点产生为止,此时所有的子网合并结束,平面离散点集的Delaunay三角网生成。以图2为例,a)1000与1001合并成100,1100与1101合并成110;b)000与001合并成00,100与101合并成10,110与111合并成11;c)00与01合并成0,10与11合并成1;d)0与1合并成根节点,合并过程结束。
  对子块构建三角网时存储了子块的凸包顶点,合并子网时所关联的点都是凸包上的顶点,因此合并子网先要找出子网对应凸包的上切线和下切线,确定合并过程中考虑的点集,之后再逐步构造三角网,最后对新生成的三角形优化使之符合Delaunay三角网性质。如图6所示,先找出凸包的上切线p1p5和下切线p4p8,以p1p5为起始扩展边找到的最优点为p6,由p1p6扩展得到的最优点为p2,直到最优点为p4或p8,合并结束。
  
  子网合并算法在寻找最优的顶点时只从已经生成的凸包顶点集中查找, 减少了寻找最优点时的遍历时间, 使得在数据量较大、分块较多的情况下合并子网时间与凸包中顶点的个数呈线性关系。
  3 性能分析和耗时测试
  假设平面离散点个数为N,平均每个子块包含M个点,则至少将点集分割成N/M个子块,因此在分割过程中建立的二叉树高度为log(N/M)。对包含M个点的子块利用Graham扫描技术构网时,先要对子块中的点集进行排序,使用快速排序法,最好情况下时间复杂度为O(M log M)。子块构网过程中,确定凸包顶点时搜索范围比较小,不需要判断点集中所有的点,平均时间复杂度为O(M),子网优化只是对有向边判断或优化数遍, 复杂度为O(K),K为有向边条数。综合以上分析,当对点集合理分割,使子块中点的数量在一定的阈值内,构建Delaunay三角网所需时间与点的数量近似呈线性关系。
笔者在VC 6.0上用C++语言实现了构网程序,运行结果正确。图7为随机生成的2 000个点所构建的Delaunay三角网。下面用随机生成的点根据子块阈值不同对运行结果进行比较,微机环境为Pentium4 1.8 GHz CPU,256 MB内存。对于随机生成的离散点集,可以认为是均匀分布在平面上,采用二叉树分割法产生子块的个数只与子块包含点的阈值有关,阈值越大,子块个数越少,反之子块个数越多。测试数据如下:随机点数为2 000,设定子块包含点的阈值分别为1 000、500、400、300、200、150、100、50,记录各自构网消耗的时间及分割子块个数。实验结果如表1所示,当阈值为200时,子块个数为14,此时构网时间最短,当阈值小于200时,构网速度开始下降。经过分析得出如下结论:阈值很大时,分割生成的子块数量小,对单个子块构网时间长;阈值很小时,分割生成的子块数量大,虽然对单个子块构网时间比较短,但需要多次对相邻子块合并,总体效率不高。  表1 不同阈值的2 000个离散点构网耗时和子块数
  
  阈值构网时间/ms生成子块数阈值构网时间/ms生成子块数
  1 0001 440320063714
  5001 176515064317
  4001 024610066824
  30083595067349
  
  对平面点集构建三角网时,只有合理确定阈值才能保证构网速度最快。阈值的选取根据经验来决定,对于随机生成的点集,可认为均匀分布在平面上,阈值一般取[N/15,N/10]间的值,N为总的点数。同时为了验证本文提出的构网算法的优越性,对一定数量的点集构网所需时间与其他构网算法所需时间进行比较,子块阈值取经验值N/12,结果如图8所示。
  
  4 结束语
  本文提出的Delaunay三角网生成算法先对平面点集最小外包矩形分割,建立子块索引二叉树,利用Graham扫描技术构建各子块三角网,最后自底向上合并具有相同父节点的子块最终得到点集的Delaunay三角网。该算法采用二叉树分块提高了子网合并效率,利用Graham扫描技术构建各子块三角网加快了构网速度,使构网时间和点的数量接近线性关系,比较适合大数据量不规则三角网的生成。同时与其他分块算法相比,本文提出的算法比较简单,易于实现。
  参考文献:
  [1]邹徐文,武百超. 基于平衡二叉树的三角网快速生成算法[J]. 辽宁工程技术大学学报,2007,26(4):513-517.
  [2]赵岩,张子平. 一种动态构建Delaunay三角网的算法[J]. 测绘工程,2008,17(3):24-28.
  [3]DWYER R A. A fast divide and conquer algorithm for constructing delaunay triangulations[J]. Algorithmica, 1987(2):137-151.
  [4]SLOAN S W. A fast algorithm for constructing Delaunay triangulation in the plane[J]. Advanced Engineering Software,1987,9(1):34-55.
  [5]栾晓岩. 一种TIN生成算法及其三维显示[J]. 测绘科学, 2004,29(5):39-41.
  [6]向传杰, 朱玉文. 一种高效的Delaunay三角网合并生成技术[J]. 计算机应用, 2002,22(11): 34-36.
  [7]刘永和,谢洪波,袁策. 一种基于三角网扩张法的Delaunay三角网逐块归并算法[J]. 测绘科学, 2007,32(3):52-55.
  [8]宋晓宇,李东,王永会. 一种基于Graham三角剖分生成Delaunay三角网的算法[J]. 沈阳建筑大学学报,2007,23(2):328-332.
  [9]郭兆胜, 张登荣. 一种改进的高效Delaunay三角网的生成算法[J]. 遥感信息, 2005(1):15-17.
  [10]石松,陈崇成,唐丽玉. Delaunay三角网的交互编辑算法设计与实现[J]. 测绘科学,2005,30(6):113-116.
[上一页1  2  3 
原创粉丝点击