基于基于不规则三角网不规则三角网不规则三角网构建构建构建的的网格生长算法刘 刚,李永树李永树,,张水舰(西南交通大学地理信息工程中心,成都 610031)摘 要:提出一种基于离散点Delaunay 三角网快速构建的网格生长算法,采用分治算法将离散点表达为唯一网格,利用稀疏矩阵完成网格数据的压缩存储,通过标识码实现有值单元格与离散点之间的高效检索,从而提高网格构建的效率。
依据有值单元格的密度获取预设正方形搜索空间,并在三角网扩展时根据需要动态建立正方形搜索空间,从而保证网格生长的准确性。
实验结果表明,该算法的时间复杂度为O (n log n ),对于少量或海量离散点均具有较好的适应性。
关键词关键词::Delaunay 三角网;不规则三角网;离散点;正方形搜素空间;网格生长算法Grid Growing Algorithm Based onTriangular Irregular Network ConstructionLIU Gang, LI Yong-shu, ZHANG Shui-jian(Geography Information Engineering Center, Southwest Jiaotong University, Chengdu 610031, China)【Abstract 】This paper presents a grid growing algorithm for fast construction of Delaunay irregular network based on discrete point. In this algorithm, a grid is achieved to express discrete point uniquely based on the divide-and-conquer method, which is compressed storage in a sparse matrix, and an efficient retrieval method is established between value cell and discrete point by identification code, which is effectively to improve the efficiency of the construction of Triangular Irregular Network(TIN). According to the density of value cells, a default square search space is acquired, and it is allowed to create the square search space dynamically in the expansion process of TIN, which ensures the accuracy of the grid growing. Experimental results show that the time complexity of the proposed algorithm is O (n log n ), and the algorithm is available to both small and massive amount of discrete points.【Key words 】Delaunay triangular network; Triangular Irregular Network(TIN); discrete point; square search space; grid growing algorithm DOI: 10.3969/j.issn.1000-3428.2011.12.019计 算 机 工 程 Computer Engineering 第37卷 第12期V ol.37 No.12 2011年6月June 2011·软件技术与数据库软件技术与数据库·· 文章编号文章编号::1000—3428(2011)12—0056—03 文献标识码文献标识码::A中图分类号中图分类号::P2091 概述不规则三角网(Triangular Irregular Network, TIN)表面建模是一种很重要的表面建模方法[1-2]。
在所有生成TIN 的方法中,Delaunay 三角网最优,它尽可能避免了病态三角形的出现,常被用来生成TIN 。
目前,利用离散点构建Delaunay 三角网的方法有很多,主要有逐点插入法、三角网生长法、分治算法等[1]。
逐点插入算法是Lawson C L [3]提出的,之后Bowyer A [4]、Watson D F [5]等人对其进行发展。
该算法的时间复杂度一般在3/2()O n ~(log )O n n [6-7],在处理过程中每插入一个点都要判断插入点所在的三角形,随着数据点的不断插入,三角形的个数成倍增加,将花费大量的时间在三角形的定位上,从而直接影响算法效率。
三角网生长法、分治法等算法的时间复杂度的下界为(log )O n n 。
三角网生长法将大部分时间花费在搜索符合要求的给定基线的邻域点过程中,分治算法由于递归执行,算法需要较大内存空间[8],对海量数据而言,两者的效率都较低。
为提高不规则三角网的构建效率,本文提出一种基于离散点构建不规则三角网的网格生长算法,重点研究如何由离散点生成规则网格,并在此基础上建立TIN 模型。
2 一种一种构建构建构建不规则三角网的不规则三角网的不规则三角网的网格网格网格生长算法生长算法2.1 离散点离散点网格网格网格化化网格由许多单元格组成,通常将单元格看成一个对象。
从处理效率上看,单元格值的情况越少,单元格之间的计算速度越快。
所以,从计算效率出发,针对离散数据确定如下规则网格构建准则:规则网格包含所有离散点,每个离散点对应一个单元格,且一个单元格内的离散点数量小于2。
当单元格内存在一个离散点时表示该单元格有值(用1表示),称为有值单元格,当不存在离散点时表示该单元格无值(即为Null),称为空值单元格,并将按照该准则建立的规则网格称为唯一网格,其唯一性体现在离散点与有值单元格的一一对应关系。
原理如图1所示,图1(a)表示一个单元格只包含 1个或0个离散点,图1(b)是对有值单元格进行赋值的结果(其中,黑色表示有值单元格即为1;其余无值即为Null)。
(a)离散点与网格关系 (b)网格化结果图1 离散点离散点网格网格网格化化 基金项目基金项目::“十一五”国家科技支撑计划基金资助项目(2006BAJ05 A13)作者简介作者简介::刘 刚(1986-),男,硕士,主研方向:复杂网络,GIS 原理及其应用;李永树,教授、博士生导师;张水舰,博士 收稿日期收稿日期::2011-01-08 E-mail :liugang233666@第37卷 第12期 57刘刚, 李永树, 张水舰:基于不规则三角网构建的网格生长算法2.2 网格网格生长生长生长算法原理算法原理空间自相关理论反映空间相邻对象在地理特性上的相互影响程度,认为距离越近的实体,彼此的影响程度越大(也可理解为共性越多或联系越紧密)。
从空间自相关角度可知,在不规则三角网构建过程中,距离当前基线较近的点对生成三角形的贡献较大,所以,算法采用局部搜索策略进行三角网的扩展,基本思想如下:根据有值单元格在网格中的密度,并以常数C N 表示每次搜索需要参考的有值单元格数量,从而确定一个正方形搜索范围R [X min, Y min, X max, Y max],之后每次扩展只需在当前基线周围的R 区域内寻找一个与当前基线满足Denaulay 三角形的有值单元格即可。
当引入局部约束条件时,将约束条件范围表达为对应的网格区域并建立相应规则。
网格生长算法原理如图2所示。
图2 网格网格生长生长生长算法原理算法原理在图2中,黑色粗线框为正方形搜索范围R ,其4个参数X min 、Y min 、X max 、Y max 为指定的行、列位置;实线三角形是已有三角形;以该三角形一边为基线并在当前正方形空间内搜索到一个有值单元格满足Delaunay 准则并生成一个新三角形,如虚线所示。
2.3 网格网格生长生长生长算法流程算法流程网格生长算法流程主要分为3个阶段:第1个阶段是由离散点构建唯一网格,建立离散点与有值单元格之间的对应关系;第2个阶段是确定每次搜索需要参考的有值单元格的数量(用N c 表示),并计算有值单元格在整个网格中的密度,从而获取空间R 的预设大小;第3个阶段是基于所建网格按照Delaunay 准则构建不规则三角网。
网格生长流程见图3。
图3 网格网格生长生长生长算法流程算法流程2.4 网格网格生长生长生长算法实现算法实现 2.4.1 数据结构在算法的整个实现过程中,需要频繁地对网格数据和离散数据进行调度,提高算法效率必须建立离散点与有值单元格之间的高效检索。
为此,建立如下数据结构,其中,Point 表示离散点;Edge 表示三角边;Triangle 表示三角形;HasUnit 表示有值单元格。
typedef struct { long id; /*离散点id 号*/ double X,Y; /*X 坐标、Y 坐标*/ } Point;typedef struct { long id; /*三角形边的id*/ long point_id[2]; /*from-point, to-point*/ long lt_id, rt_id; /*边左右邻接三角形*/ } Edge;typedef struct { long id; /*三角形id*/ long edge_id[3]; /*三角形三条边的id*/ } Triangle; typedef struct { long row, column; /*单元格行、列号*/ long point_id; /*单元格对应的离散点id*/ } HasUnit;按照2.1节中网格构建准则构建的规则网格的单元格数量很大,但有值单元格所占比重极小。
在空间分布上可认为该网格是一个稀疏矩阵,所以,采用三元组顺序表实现网格的压缩存储以及与离散点的高效检索。
网格存储结构见表1。
表1 网格网格存储结构存储结构有值单元格的行号 有值单元格的列号 对应的离散点id 号25 28 3 201 139 … … … mnk2.4.2 基于离散点的唯一网格构建根据离散点数据构建唯一网格的过程如下:(1)求出离散点集合P 的最小矩形范围T [X min, Y min, X max, Y max]。