快速构建 Delaunay 三角网算法研究及OpenGL下三维可视化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
快速构建 Delaunay 三角网算法研究及OpenGL下三维可视
化
王星
【摘要】对Delaunay三角网的构建算法进行研究.提出了一种基于网格索引的构网算法.借助于该算法的特点提出了一种新的点一块一三角形映射机制定位点所在三角形的方法.简化了三角网的优化过程,提高了三角网构建速度.同时在OpenGL 开放式三维环境下,进行光照渲染等处理,实现了地形的三维可视化.%The construction of TIN based on grid index is reseached. A new point-block-triangle mapping mechanism used to locate the location of point is put forward in virtue of algorithmic characters, which simplifies the LOP of TIN and improves the speed of the constructing net. At the same time, it realizes the terrain 3D visualization in OpenGL environment by lighting and colouring.
【期刊名称】《科学技术与工程》
【年(卷),期】2011(011)009
【总页数】5页(P2070-2074)
【关键词】Delaunay三角网;网格索引;三维可视化;OpenGL
【作者】王星
【作者单位】昆明理工大学,昆明,650031
【正文语种】中文
【中图分类】P217
DTM(数字地面模型)是实现地形三维可视化一种很有效的途径。
栅格和TIN(不规
则三角网)是表示DTM的两种主要数据格式。
与栅格方法对格网的周围采样点按
照距离远近加权平均的思想不同,TIN方法采取的是一种更加忠实于原始数据的方法,它几乎完整地保留原始数据,按Delaunay原则将采样点直接连成网建立起模型。
TIN在地理信息系统、地质学、计算机图形学、计算机仿真及虚拟现实等领域也有着广泛的应用,是目前DTM常采用的一种格式。
寻求一种快速构建TIN的算法,是众多学者研究和关注的焦点。
目前有关TIN的构建算法也基本趋于成熟,
主要有三角网生长算法、内插算法和分割-合并算法等,目前采用后二者或是后两
者的结合比较常见[1—4]。
Shamos 和 Hoey[5]首先提出了分割合并的思想,并证明了在N个离散数据点中建立Delaunay三角网的时间复杂度至少为NlgN。
Lewis和Robinson应用分割-合并思想,实现了Delaunay三角网的构建。
该方法运行效率很高,但由于要频频用到递归算法导致内存消耗过大。
对于逐点内插法,很多已经研究表明,其消耗的空间较少,但时间复杂度较差,运行速度很慢。
Lawson[6]的逐点插入法思路清晰、简单,编程容易实现。
充分利用逐点插入
法的优点,在数据点集基础上建立网格索引,然后通过对邻接格网的搜索快速定位点所在的三角形来构建三角网,大大减少定位目标点的时间而提高了构网速度。
构网采用高效的数据结构,从而降低了算法的复杂度和内存消耗。
随着计算机、计算机图形学和GIS等技术的快速发展和人类们需求的不断提高,三维可视化已成为
一种发展趋势,地表三维可视化也成为了可能。
对于二维Delaunay三角网不能反映出地表的起伏状态,真实感不强,信息量和实用性不足,不能满足人们的视觉需求。
如果能把平面效果的TIN转化为三维立体模型,实现三维可视化,其观赏性
和实用性将大大加强,也可应用于三维GIS和人机交互中进行三维透视、动画漫
游等。
针对这种情况,在构建TIN的过程中借助于OpenGL三维环境,对构建的三角网进行了光照渲染等处理,转变为立体模型,实现了三维可视化,很好地解决了以上问题。
1 构建TIN涉及的数据结构
为了对离散数据点集进行有效的数据管理,减少内存空间消耗,在构建TIN时采
用的数据结构只有点和三角形(面)结构。
数据结构定义如下:
typedef struct //点结构
{ int PointNumber;//离散点号
double x,y,z;//离散点的三维坐标
}vertex;
typedef struct //三角形结构
{
long id;//三角形号
long p1,p2,p3;//三角形的三个邻接多边形
}TRIANGLE;
2 建立网格索引
在构建三角网之前,一般是对离散点按X坐标排序,这样相邻点所在三角形也相
对较近。
当点的Y坐标差异较大时,虽两点排序后相邻,但所在三角形却相距很远,这时定位点所在三角形效率很低,采用格网法即可解决此问题。
网格索引技术是提高定位速度的一个非常关键的因素,因为建立网格索引可以大大缩小搜索范围,在常数时间内定位到插入点P所在三角形。
其步骤如下:
步骤1 在对离散点处理后可得到所有离散点X、Y 坐标的最大和最小值 xmax、xmin、ymax、ymin,于是可构建格网将所有离散点包含在内。
由于每个格子用
一个整型数据表示,所以格子的数量不超过离散点数量。
若格子数量太少,每个格
子内有大量三角形,从而点在该格子内定位三角形即使按直线查找仍需查找大量三角形,未起到快速定位作用。
经试验研究,格子数约为离散点数的1/10为宜。
步骤2 假设离散点基本均匀分布,使行数和列数分别与Y坐标和X坐标的跨度成正比。
则:
Nr=(dy/dx)(Np/10)1/2;Nc=(dx/dy)(Np/10)1/2。
式中,Nr为行数;Nc为列数;dx为离散点区域X坐标跨度;dy为离散点区域Y坐标跨度;Np为离散点数量。
插入点所在格网的行和列位置,则由坐标值判断:
r=(y-ymin)/(dy/Nr);
c=(x-xmin)/(dx/Nc)。
式中,r为插入点所在格网的行位置;c为插入点所在格网的列位置;X、Y为插入点的平面坐标;xmin、ymin为所有插入点中横、纵坐标最小值。
3 快速定位点所在的三角形
逐点插入算法中一个重要环节就是定位插入点所在的三角形。
一般将点在三角形中的查找算法称为三角形的定位问题。
解决这一问题的最直接的办法就是利用计算几何中点在多边形(此处多边形为三角形)中的测试方法。
由于每插入一点要对整个三角网扫描一次,显然这种方法是比较费时的。
尽管可以通过建立索引的方法来减少定位时间,但效率仍然较低。
在TIN(泰森不规则三角网)中,如果建立了三角形之间的拓扑关系,利用格网定位和三角形面积坐标,则很容易判断插入点所在的三角形。
每个网格中只记录任一个落在该网格内的三角形的标识号,而不需要将落在网格中的所有三角形标识号都记录下来,这样大大减少了内存消耗。
采用内插法进行构网时,网格中记录的三角形被实时更新,因为每内插一个点到三角网中,三角网中局部区域内的三角形会被更新。
网格索引定位算法如果要定位点所在的三角形,先要通过点的坐标计算它所落的网格,找到该网格中记录的三角形,这也就是所谓的点-块-三角形的映射机制。
现今最常用的定位法是重心法:首三角形内任取一点
(一般取三角形的重心)与目标点P就可以组成一条方向线,该方向线穿越的三角形是唯一的。
理论上来讲,如果能保证沿该方向线进行定位,则该定位方法是最优的,文献[7]中提出的最速方向线定位法,没有考虑两种特殊情况:即方向线经过三角形的顶点及方向线与三角形的边重合。
文献[8]考虑到特殊情况计算过程又特别复杂。
为了解决上述问题,使算法更健壮,结合本文的数据结构采用格网定位+邻接格网定位+最新生存的三角形+拓扑结构中邻接三角形方法定位点所在三角形。
算法的实现过程如下:
(1)根据插入点的X、Y坐标找到点所在的格网,如果该格网记录有三角形编号,
则从该三角形开始,在其邻接三角形中定位插入点所在的三角形。
否则转(2)。
(2)由近及远遍历该格网的邻接格网(一定阈值内),如果某一格网记录有三角形编号,则遍历结束。
从该三角形开始,在其邻接三角形中定位插入点所在的三角形。
否则转(3)。
(3)先得到最新生成三角形的编号,从该三角形开始,在其邻接三角形中定位插入
点所在的三角形。
这时只需查找极少三角形即可定位到插入点所在三角形。
在定位简化过程中,三角形面积定位方法最为常用,在此基础上的改进算法不计算三角形面积坐标,而仅关心其正负号。
故当三角形顶点P按逆时针方向排列时,
点 P的面积坐标(s1、s2、s3)可简化为:
s1=(y-y2)(x3-x2)-(y3-y2)(x-x2);
s2=(y-y3)(x1-x3)-(y1-y3)(x-x3);
s3=(y-y1)(x2-x1)-(y2-y1)(x-x1)。
则P与三角形的位置关系可以用P的面积坐标(s1、s2、s3)的正负关系来判断:
s1>0且s2>0且s3>0则插入点P在三角形中。
4 LOP法则判断
在相邻的两个三角形(abd和bcd)所组成的四边形中,如果对角线交换所得的两个新三角形ABC和ABD(图1)比原来的两个三角形更优,则用新的两个三角形替代
原来的两个三角形。
更优的标准之一是最小角度最大原则:调整前的二个三角形共
六个内角中的最小角和调整后的六个角中的最小角相比较,若前者小于后者则调整,否则不调整;标准之二是空外接圆性质:在由点集V所形成的D-三角网中,其每个
三角形的外接圆均不包含点集V中的其他任意点。
结合本文定义的数据结构,本
文采取了以相邻三角形作为优化着眼点的处理算法。
根据Delaunay三角网空外接圆性质有以下判断:当sin(∠C+∠D)≤0,不进行优化,否则进行优化。
如果直接计
算出sin(∠C+∠D)则过于复杂,本文只关心它的符号,不关心它的数值,可以简化为
图1 空外接圆检查
这个式子得到的前提是三角形的各个顶点满足逆时针存储。
式中的 x1、y1,x2、
y2,x3、y3 和 x4、y4 分别是A、B、C和D 4点坐标。
5 算法的实现步骤
5.1 初始化
对点集中所有的点进行一次遍历,求得每个节点在哪个格网内。
所有网格记录一个三角形编号,初始值为-1。
找出包含所有节点的外接矩形,连接对角线构造初始三角网,矩形四个角所在格网的三角形值赋予对应的三角形编号。
5.2 判断点所在的三角形
根据网格索引找到插入点所在的格网,如果该格网的三角形存在,则判断该点是否在该三角形的外接圆中,是则找到,否则判断其邻接三角形直到找到为止。
如果该格网的三角形不存在(值为-1),则找其邻接格网的三角形,如果在一定范围内邻
接格网的三角形都不存在则从最新的三角形开始,在其邻接三角形中找插入点所在
的三角形。
如果该三角形外接圆包含该点则找到插入点所在的三角形。
5.3 构造新的三角网
找到插入点所在的三角形后,连接插入点和三角形三个顶点,形成三个新的三角形,然后进行LOP法则判断,格网三角形编号和三角形邻接三角形的更新。
6 三维可视化
二维三角网不能有效地表达地表面的起伏状态,视觉效果不明显,信息量不足。
为了弥补二维TIN的不足,本文在构建TIN时,在Visual C++6.0编程语言中调用了OpenGL三个动态连接库,分别是 opengl32.lib、glu32.lib 和 glaux.lib,这
就与OpenGL开放式三维环境相结合,可以直接调用动态库中的成员函数。
将离散点的Z坐标值也参与构网,设计像素格式、模型绘制、选择视点及投影模式、
选定光源,同时进行光照暄染以达到三维可视化的目的,这样就很好地解决二维平面TIN的不足。
本文进行光照渲染时,主要是根据数学方法及经验决定光源的位
置和颜色,三维效果显示比较明显。
7 应用实例及结论
该算法在实现中采用的是Windows 7操作系统,开发工具为Visual C++6.0及OpenGL库。
为了检验算法的效率,对网格定位算法的执行效率与常规法进行了
比较,其统计结果如表1所示。
为了实现地形三维可视化,本文将构网过程在OpenGL下进行,嵌入约束数据并进行光照等操作生成的三维模型如图3所示,
实验结果很好地说明了算法的高效性,并实现了三维可视化。
上述算法有效地减少了查找插入点所在三角形的时间,大大提高了构网速度,并借助于该算法的特点,充分利用格网定位的优势同时减少所需的内存空间,论文提出了一种新的点-块-三角形的映射机制定位点所在三角形的方法,同时借助于OpenGL开放式三维环境,对构成的TIN进行了光照渲染等处理,达到了三维可视化的目的。
通过图2和图
3的比较,不仅满足了人们视角上的需要,而且更加方便地将生成的模型用于实际
的应用中,诸如填、挖方及坡度计算,剖面图获取等。
图2 二维Delaunay三角网
图3 三维Delaunay三角网
表1 常规算法及文中算法构网时间比较?
参考文献
【相关文献】
1 吴晓波,王世新,肖春生.一种生成Delaunay三角网的合成算法.遥感学报,2000;4(1):32—35
2 吴宇晓,张登荣.生成Delaunay三角网的快速合成算法.浙江大学学报(理学版),
2004;31(3):343—348
3 向传杰,朱玉文.一种高效的Delaunay三角网合并生成技术.计算机应用,2002;22(11):34—36
4 蒋红斐.基于分治算法构建Delaunay三角网的研究.计算机工程与应用,2003;16(81):81—82
5 Shamos M I,Hoey D.closet-point problems.In:Proceedings of the 16th Annual Symposium on the Foundations of Computer Science,1975:151—162
6 Lawson C L.Software for c Surface interpolation.Mathematic Soft-ware III,J Rice ED.New York:Academic Press,1977:61—194
7 蒲浩,宋占峰,詹振炎.快速构建三角网数字地形模型方法的研究.中国铁道科学,
2001;22(6):100—105
8 刘少华,吴东胜,罗小龙,等.Delaunay三角网中点目标快速定位算法研究.测绘科学,2007;32(2):69—70。