1第五章不规则三角网(TIN)生成的算法5.1.1递归生长法递归生长算法的基本过程为如图5.1.1所示:(a)形成第一个三角形(b)扩展生成第二个和第三个三角形图5.1.1递归生长法构建Delaunay三角网(1)在所有数据中取任意一点1(一般从几何中心附近开始),查找距离此点最近的点2,相连后作为初始基线1-2;(2)在初始基线右边应用Delaunay法则搜寻第三点3,形成第一个Delaunay三角形;(3)并以此三角形的两条新边(2-3,3-1)作为新的初始基线;(4)重复步骤(2)和(3)直至所有数据点处理完毕。该算法主要的工作是在大量数据点中搜寻给定基线符合要求的邻域点。一种比较简单的搜索方法是通过计算三角形外接圆的圆心和半径来完成对邻域点的搜索。为减少搜索时间,还可以预先将数据按X或Y坐标分块并进行排序。使用外接圆的搜索方法限定了基线的待选邻域点,因而降低了用于搜寻Delaunay三角网的计算时间。如果引入约束线段,则在确定第三点时还要判断形成的三角形边是否与约束线段交叉。21321325.1.2凸闭包收缩法与递归生长法相反,凸闭包搜索法的基本思想是首先找到包含数据区域的最小凸多边形,并从该多边形开始从外向里逐层形成三角形网络。平面点凸闭包的定义是包含这些平面点的最小凸多边形。在凸闭包中,连接任意两点的线段必须完全位于多边形内。凸闭包是数据点的自然极限边界,相当于包围数据点的最短路径。显然,凸闭包是数据集标准Delaunay三角网的一部分。计算凸闭包算法步骤包括:(1)搜寻分别对应x-y,x+y最大值及x-y,x+y最小值的各二个点。这些点为凸闭包的顶点,且总是位于数据集的四个角上,如图5.1.2(a)中的点7,9,12,6所示;(2)将这些点以逆时针方向存储于循环链表中;(3)对链表中的点I及其后续点J搜索线段IJ及其右边的所有点,计算对IJ有最大偏移量的点K作为IJ之间新的凸闭包顶点,如点11对边7-9。(4)重复(2)-(3)直至找不到新的顶点为止。(a)初始边界7,9,12,6;(b)搜索凸闭包顶点11,5,4;(c)凸闭包图5.1.2凸闭包的计算(引自Tsai,1993)一旦提取出数据区域的凸闭包,就可以从其中的一条边开始逐层构建三角网,具体算法如下:3(a)第一个三角形(b)第一层三角形图5.1.3凸闭包收缩法形成三角网(1)将凸多边形按逆时针顺序存入链表结构,左下角点附近的顶点排第一;(2)选择第一个点作为起点,与其相邻点的连线作为第一条基边,如图5.1.3(a)中的9-5;(3)从数据点中寻找与基边左最邻近的点8作为三角形的顶点。这样便形成了第一个Delaunay三角形;(4)将起点9与顶点8的连线换作基边,重复(3)即可形成第二个三角形;(5)重复第(4)步,直到三角形的顶点为另一个边界点11。这样,借助于一个起点9便形成了一层Delaunay三角形;(6)适当修改边界点序列,依次选取前一层三角网的顶点作为新起点,重复前面的处理,便可建立起连续的一层一层的三角网。该方法同样可以考虑约束线段。但随着数据点分布密度的不同,实际情况往往比较复杂。比如边界收缩后一个完整的区域可能会分解成若干个相互独立的子区域。当数据量较大时如何提高顶点选择的效率是该方法的关键。5.2数据逐点插入法5.1节介绍的三角网生长算法最大的问题是计算的时间复杂性,由于每个三角形的形成都涉及所有待处理的点,且难于通过简单的分块或排序予以彻底解决。数据点越多,问题越突出。本节将要介绍的数据逐点插入法在很大程度上克服了数据选择问题。其具体算法如下(见图5.2.1):(1)首先提取整个数据区域的最小外界矩形范围,并以此作为最简单的凸闭包。(2)按一定规则将数据区域的矩形范围进行格网划分,为了取得比较理想的综合效率,可以限定每个格网单元平均拥有的数据点数。(3)根据数据点的(x,y)坐标建立分块索引的线性链表。(4)剖分数据区域的凸闭包形成两个超三角形,所有的数据点都一定在这两个三角形范围内。4(5)按照(3)建立的数据链表顺序往(4)的三角形中插入数据点。首先找到包含数据点的三角形,进而连接该点与三角形的三个顶点,简单剖分该三角形为三个新的三角形。(6)根据Delaunay三角形的空圆特性,分别调整新生成的三个三角形及其相邻的三角形。对相邻的三角形两两进行检测,如果其中一个三角形的外接圆中包含有另一个三角形除公共顶点外的第三个顶点,则交换公共边。(7)重复(5)-(6)直至所有的数据点都被插入到三角网中。(a)第一分块数据插入后(b)第二分块数据插入后(c)全部三角形图5.2.1逐点插入法构建Delaunay三角网可见,由于步骤(3)的处理,保证相邻的数据点渐次插入,并通过搜寻加入点的影响三角网(InfluenceTriangulation),现存的三角网在局部范围内得到了动态更新。从而大大提高了寻找包含数据点的三角形的效率。5.3带约束条件的Delaunay三角网当不相交的地形特征线、特殊的范围边界线等被作为预先定义的限制条件作用于TIN的生成当中时,必须考虑带约束条件的Delaunay三角网。最简单的处理方法是所谓的“加密法”,即通过加密约束线段上的数据点,将约束数据转换为普通数据,从而按标准Delaunay三角形剖分即可。尽管该方法加大了数据量并改变了原始数据集,但由于简单易行、稳定可靠,在许多情况下可以很好地满足需要。该方法唯一的问题在于如何恰当地确定特征线上加密数据点之间的距离,一般取平均数据点间距的一半或更小即可。以下内容主要介绍直接处理约束线段的算法。55.3.1带约束条件的Delaunay三角网的定义定义1:给定一个d维欧基里德空间E和一个N点mi集M。那么,关联的Voronoi图(又称Thiessen多边形)为覆盖E的一个凸多边形序列(V(m1),V(m2),…,V(mN)),其中,V(mi)包括E中所有以M中的mi为最近点的点,即V(mi)=p∈E∶Vj,1≤j≤N,d(p,mi)≤d(p,mj),d表示欧基里德距离。Voronoi图的几何对偶(dual),即把点mi联结起来而得到的邻接格网称为M的Delaunay三角网。显然,Delaunay三角网的元素之并等于M的凸包之内部。Delaunay三角网自然推广到输入数据不仅包括点集M,还包括不相交叉的直线段集L。在计算几何里,这类问题称约束Delaunay三角网(ConstrainedDelaunayTriangles,简称CDT)问题。对地形数据来说,L即地形特征线段集(朱庆,陈楚江,1998)。定义2:令单点集M和线段端点集E之并为V(V=M∪E),如果在V的每个Delaunay三角形的外接圆范围内不包含任何与三角形的顶点均通视的其它点,而点Pi与Pj(Pi,Pj∈V)当且仅当连线PiPj不与L中的任何约束线段相交叉(除在端点处外)时才互相通视,那么称这个Delaunay三角网为V由L约束的Delaunay三角网(朱庆,陈楚江,1998)。5.3.2带约束条件的Delaunay法则带约束条件的三角网仍然满足Delaunay法则,但其局部等角特性有较小的改变。当需要考虑约束条件时,可视图有助于重新定义Delaunay法则和LawsonLOP交换原则。对数据点及作为约束条件的断裂线,可视图由互相可视的任意两点连接而成。在可视图中,除在断裂线的端点处外,连接线与任一断裂线都不相交(图5.3.1)。由此Delaunay法则及LawsonLOP交换可以重新定义为:带约束条件的Delaunay法则:只有当三角形外接圆内不包含任何其它点,且其三个顶点相互通视时,此三角形才是一个带约束条件的Delaunay三角形。带约束条件的DelaunayLawsonLOP交换:只有在带约束条件的Delaunay法则满足的条件下,由两相邻三角形组成的凸四边形的局部最佳对角线(LocallyOptimalDiagonal)才被选取。6图5.3.19个点与两条约束线段的通视图(引自Tsai,1993)5.3.3顾及线段约束的三角网生成算法考虑线段约束可以在形成Delaunay三角形的同时进行,如根据带约束条件的Delaunay法则建立静态三角网的生长算法就是如此。而采用更多的方法是在动态生成三角网的基础上,采用两步法实现CDT的建立。所谓两步法即分以下两步完成:(1)将所有数据包括约束线段上的数据点,建立标准的Delaunay三角网。(2)嵌入线段约束,根据对角线交换法LOP调整每条线段影响区域内的所有三角形。在作为约束条件的地形特征信息存在时,当标准Delaunay三角网建立起来后,便可加入预先给定的约束线段以完成带约束条件的Delaunay三角网的构建。如图5.3.2所示,下面步骤用于完成约束线段的插入:(1)在三角网中插入一约束线段;(2)确定边界与约束线段相交的三角形,如果两个这样的三角形有公共边,则将此公共边删除,最后形成约束线段的影响多边形;(3)将影响多边形其它各顶点与约束线段的起始节点相连;(4)应用带约束条件的LOP交换,更新影响多边形内的三角网,使约束边成为三角网中的一边;(5)重复步骤1-4,直至所有约束线段都加入三角网中。7(a)插入线段ab,搜索其影响多边形;(b)连接节点a与影响多边形的所有顶点;(c)应用带约束条件的LawsonLOP交换对三角网进行优化;(d)带约束线段ab的三角网图5.3.2约束线段ab插入到已有Delaunay三角网的过程(引自Tsai,1993)5.3.4从等高线生成三角网等高线是一种特殊的特征线,等高线也可以作为约束线段。从等高线生成三角网一般有三种算法:等高线离散点直接生成TIN方法、将等高线作为特征线的方法、自动增加特征点及优化TIN的方法。等高线离散点直接生成TIN方法直接将等高线上的点离散化,然后采用上面所讲的从不规则点生成TIN的方法。但是由于这种算法只独立地考虑了数据中的每一个点,而并未考虑等高线数据的特殊结构,所以会导致很坏的结果,如出现三角形的三个顶点都位于同一条等高线上(即所谓的“平三角形”)或者三角形某一边穿过了等高线这样的情况(图5.3.3)。这些情形按TIN的特性都是不允许的。因此,在实际应用中,这种算法很少直接使用。通常将等高线作为特征线来构建三角网。(a)三角形与等高线相交;(b)三角形的三个顶点都位于同一条等高线上图5.3.3对等高线进行不合理三角化的例子将等高线作为特征线生成三角网一般有两种算法:将等高线作为特征线的方法、自动增加特征点及优化TIN的方法。8将每一条等高线当作断裂线或结构线时,对三角形而言,至多只能从同一等高线取两个点。图5.3.4显示了一个考虑等高线特性的Delaunay三角网。图5.3.4将等高线当作断裂线以建立三角网自动增加特征点及优化TIN的方法是:仍将等高线离散化建立TIN,但采用增加特征点的方式来消除TIN中的“平三角形”,并使用优化TIN的方式来消除不合理的三角形比如三角形与等高线相交等,另外对TIN中的三角形进行处理以使得TIN更接近理想化的情况。使用手工方式增加特征点线,无论在效率方面,还是在完整性、合理性等方面都是很有限的。因此需要设计一定的算法来自动提取特征点。这些算法的原理大都基于原始等高线的拓扑关系。对TIN进行优化则需对三角形进行扫描判断并以一定的准则进行合理化的处理。由等高线重建地形的方法中使用骨架线可以保留曲线段之间的拓扑关系。从等高线图生成的Voronoi图上提取骨架线,骨架线可用于提取附加点以消除“平三角形”。附加点的高程可由估算获得。基于该方法可以估计出合理的地形坡度,并且为TIN提取有意义的中间点(Gold,2000)。从等高线图生成的Voronoi图上提取骨架线的原理如图(5.3.5)所示,当Delaunay三角形的外接圆不包含Voronoi图的顶点时,Voronoi图顶点在骨架线上(图5.3.5(a));当Delaunay三角形的外接圆包含Voronoi图的顶点时,Delaunay三角形的边就是边界线(图5.3.5(b))。9(a)(b)