一种面向TIN构建的KD-Tree排序方法

文档序号:10569982阅读:294来源:国知局
一种面向TIN构建的KD-Tree排序方法
【专利摘要】本发明涉及一种面向TIN构建的KD?Tree排序方法,包括以下步骤:(1)读入待排序的二维点集P;(2)将点集P中所有点的深度加1,求出点集P在划分方向T上的中位数,以此中位数将点集P分为两个子点集;(3)判断子点集是否划分完成;(4)等待所有子点集划分完成,把步骤(1)中读入的所有点按照深度递增的顺序进行排序。本发明的方法能够直接根据点集的坐标来对点集进行KD?Tree排序,从而摆脱对KD?Tree的依赖,能够有效地解决TIN构建过程点集的KD?Tree排序问题,大大减少了不必要的计算开销,进而提高TIN构建的算法效率。
【专利说明】
_种面向T IN构建的KD-Tree排序方法
技术领域
[0001] 本发明涉及地理信息系统、地质学、计算机图形学、计算机仿真及虚拟现实等领 域,具体涉及一种面向TIN构建的KD-Tree排序方法。
【背景技术】
[0002] DTM(数字表面模型)是实现地形三维可视化的一种有效途径。栅格和TIN(不规则 三角网)是表示DTM的两种主要数据格式。与栅格方法对格网的周围采样点按照距离远近加 权平均的思想不同,TIN方法采取的是一种更加忠实于原始数据的方法,它几乎完整地保留 了原始数据,按Delaunay原则将采样点直接连成网建立起模型。因此,TIN在地理信息系统、 地质学、计算机图形学、计算机仿真及虚拟现实等领域都有着广泛的应用,是目前DTM常采 用的一种格式。
[0003] 在众多的TIN构建算法中,逐点插入法由于算法简单、占用空间小、便于动态更新 等优点逐渐成为目前最流行的一种算法。起初逐点插入法的效率比较低,为了提高构网的 效率,学者们设计了许多的改进方案。经过1^0、13〇¥5^1'、¥3七8〇11、81〇311、]\^〇6(1〇111&、 Floriani、Tasi先后对逐点插入法不同程度的发展和完善,形成了以创建初始包围盒、点定 位、空腔扩展、更新三角网为主要流程的逐点插入法。在此基础上,为了进一步提高逐点插 入法的算法效率,学者们的研究焦点主要集中在"点定位"这个过程上。Lo(Liu J F,Yan J H,Lo S H.A new insertion sequence for incremental Delaunay triangulation[J] ? Acta Mechanica Sinica,2013,29( 1):99-109?)在论文中证明了KD-Tree能够通过对点集 排序,显著提高TIN的构建效率。然而以往利用KD-Tree进行排序,往往需要构建一棵KD-Tree,通过将点集不断插入到KD-Tree中,然后按照深度优先或者广度优先的顺序来输出 KD-Tree中的点,以达到对空间点集的排序目的。这种传统做法有着两方面的不足:(1)内存 消耗过大。随着数据采集技术的发展,点集的数据量越来越大,通过构建树形结构继续排 序,会导致树的深度非常深,进而使得辅助排序的树形结构占用极高的内存;(2)排序效率 较低。使用树形结构进行排序,是一种从空间网格出发的排序算法,需要逐个判断每个点所 归属的KD-Tree节点,这个过程非常费时,往往排序的时间比构网的时间还要久。

【发明内容】

[0004] 为了改善传统KD-Tree排序方法的不足及提高逐点插入法构网的效率,本发明提 出一种全新的KD-Tree排序方法,在显著降低算法内存需求的情况下,极大的提高了 KD-Tree 排序的 效率, 有利于 KD-Tree 排序的 推广和应用。
[0005] 本发明采用的技术方案是:
[0006] -种面向TIN构建的KD-Tree排序方法,包括以下步骤:
[0007] (1)读入待排序的二维点集P= {pi,i G [0,n)},包括n个点的X坐标和Y坐标,同时 为每个点添加一个深度标记D,表示包含该点的KD-Tree节点的深度,设深度D的初始值为-1;设KD-Tree的初始划分方向T为X轴方向;
[0008] (2)将点集P中所有点的深度D加1,求出点集P在划分方向T上的中位数,以此中位 数将点集P分为两部分:Pi和P2;具体过程为:如果划分方向T为X轴方向,则求出点集P的X坐 标中位数Xo. 5,否则计算点集P的Y坐标中位数Yo.5,利用中位数调整点集P内点的存储顺序, 以满足如下条件:
[0009] 如果划分方向T为X轴方
[0010] 如果划分方向T为Y轴方
[0011] 此时,设
[0012] ⑶对于步骤⑵中得到的子点集丹和内,判断其中包含的点数是否大于1,如果是, 则说明子点集需要继续划分,分别以子点集丹和内作为输入点集P,以与划分方向T垂直的方 向作为划分方向,递归执行步骤(2)和(3);否则该子点集划分完成;
[0013] (4)等待所有子点集划分完成,把步骤(1)中读入的所有点按照深度D递增的顺序 进行排序,最后得到的就是输入点集P的KD-Tree广度遍历排序。
[0014]步骤(2)中,中位数的定义:对于点集P = {pi,i G [ 0,n)},其X坐标的中位数Xo. 5是 将点集?中的点按照X坐标从小到大排序,然后取中间点的X坐标值,即X坐标的中位数Xo. 5 = pn/2 ? X;其Y坐标的中位数Yo.5是将点集P中的点按照Y坐标从小到大排序,然后去中间点的Y 坐标值,即Y坐标的中位数Y0.5 = pn/2 ? y。
[0015] 步骤(3)中,与划分方向T垂直的方向是指:如果划分方向T为X轴方向,则与划分方 向T垂直的方向为Y轴方向;如果划分方向T为Y轴方向,则与划分方向T垂直的方向为X轴方 向。
[0016] 现有的KD-Tree排序方法不仅会消耗较多的内存,还会导致较低的排序效率。本发 明所述的方法能够直接根据点集的坐标来对点集进行KD-Tree排序,从而摆脱对KD-Tree的 依赖。采用本发明方法,能够有效地解决TIN构建过程点集的KD-Tree排序问题,大大减少了 不必要的计算开销,进而提高TIN构建的算法效率。
【附图说明】
[0017]图1是本发明方法的流程图;
[0018]图2是本发明实施例的输入点集示意图;
[0019]图3是本发明实施例的KD-Tree空间划分示意图;
[0020]图4是本发明实施例的KD-Tree示意图。
【具体实施方式】
[0021]下面结合附图和实施例作进一步详细说明。
[0022] 如附图1所示,本发明所述的一种面向TIN构建的Hilbert排序方法包括以下基本 步骤:
[0023] (1)读入待排序的二维点集P= {pi,i G [0,n)},包括n个点的X坐标和Y坐标,同时 为每个点添加一个深度标记D,表示包含该点的KD-Tree节点的深度,设D的初始值为-1;设 KD-Tree的初始划分方向T为X轴方向;
[0024] 本实施例的初始点集为
[0025] P={(3,3,-1)、(11,1,-1)、(15,3,-1)、(3,15,-1)、(3,7,-1)、(1,13,-1)、(5,11,_ 1)、(13,7,-1)、(9,9,-1)、(7,5,-1)、(9,15,-1)、(13,13,-1)、(11,13,-1)、(11,5,-1)},括 号中的数字分别表示每个点的X坐标、Y坐标和深度D,其分布如附图2所示。
[0026] (2)将点集P中所有点的深度加1,求出点集P在划分方向T上的中位数,以此中位数 将点集分为两部分:Pi和P 2;具体包括:如果划分方向T为X轴方向,则求出点集P的X坐标中位 数Xo. 5,否则计算P的Y坐标中位数Yo. 5,利用中位数调整点集P内点的存储顺序,以满足如下 条件:
[0027] 如果T为
[0028] 如果T为
[0029] 此时,设
[0030] 本实施例的划分方向T为X轴方向,计算点集P的X轴中位数Xo.5 = 9,以Xo.jl^P得 到:
[0031]
[0032] P2={(11,1,0)、(11,13,0)、(11,5,0)、(13,7,0)、(13,13,0)、(15,3,0)}
[0033] 点p(9,15,0)是本次划分过程的中间元素,因而不再参与后面的划分,暂时保存在 P3中:
[0034] p3={(9,15,0)}
[0035] (3)对于(2)中得到的子点集?1和内,判断其中包含的点数是否大于1,如果是,则说 明该子点集需要继续划分,分别以P#PP 2作为输入点集P,以与划分方向T垂直的方向作为划 分方向,递归执行步骤(2)、(3);否则该子点集划分完成;
[0036] 本实施例的P冲包含7个点,P2中包含6个点,都大于1,因而分别令P = P#PP2,以Y 轴为划分方向,递归执行(2)和(3)。
[0037] 所有的划分过程如附图3所示,附图4是附图3的树形表示。
[0038]划分完成后得到的点集如下:
[0039] {(9,15,0)、(9,9,1)、(3,7,2)、(3,3,3)、(7,5,3)、(3,15,2)、(1,13,3)、(5,11,3)、 (13,7,1)、(11,5,2)、(11,1,3)、(15,3,3)、(13,13,2)、(11,13,3)}
[0040] (4)等待所有子点集划分完成,把(1)中读入的所有点按照深度D递增的顺序进行 排序,最后得到的就是输入点集的KD-Tree广度遍历排序。
[0041] 将步骤(3)最后得到的划分结果按照深度D递增的顺序排序,就实现了步骤(1)中 输入点集的KD-Tree广度遍历排序,最终结果如下:
[0042] {(9,15,0)、(9,9,1)、(13,7,1)、(3,7,2)、(3,15,2)、(11,5,2)、(13,13,2)、(3,3, 3)、(7,5,3)、(1,13,3)、(5,11,3)、(11,1,3)、(15,3,3)、(11,13,3)}。
【主权项】
1. 一种面向TIN构建的KD-Tree排序方法,其特征在于,包括以下步骤: (1) 读入待排序的二维点集P = {pi,ie[0,n)},包括η个点的X坐标和Y坐标,同时为每个 点添加一个深度标记D,表示包含该点的KD-Tree节点的深度,设深度D的初始值为-1;设KD-Tree 的初始划分方向 Τ 为X轴方向; (2) 将点集P中所有点的深度D加1,求出点集P在划分方向T上的中位数,以此中位数将 点集P分为两部分:Pi和P2;具体过程为:如果划分方向T为X轴方向,则求出点集P的X坐标中 位数Χο. 5,否则计算点集P的Y坐标中位数Υο. 5,利用中位数调整点集P内点的存储顺序,以满 足如下条件:(3) 对于步骤(2)中得到的子点集?1和内,判断其中包含的点数是否大于1,如果是,则说 明子点集需要继续划分,分别以子点集丹和内作为输入点集P,以与划分方向T垂直的方向作 为划分方向,递归执行步骤(2)和(3);否则该子点集划分完成; (4) 等待所有子点集划分完成,把步骤(1)中读入的所有点按照深度D递增的顺序进行 排序,最后得到的就是输入点集P的KD-Tree广度遍历排序。2. 根据权利要求1所述的一种面向TIN构建的KD-Tree排序方法,其特征在于,步骤(2) 中,中位数的定义:对于点集P = {Pi,i e [ 0,n)},其X坐标的中位数X〇. 5是将点集P中的点按 照X坐标从小到大排序,然后取中间点的X坐标值,即X坐标的中位数Χο.5 = ρη/2 · X;其Υ坐标 的中位数Υο. 5是将点集Ρ中的点按照Υ坐标从小到大排序,然后去中间点的Υ坐标值,g卩Υ坐标 的中位数Yo.5=pn/2 · y。3. 根据权利要求1所述的一种面向TIN构建的KD-Tree排序方法,其特征在于,步骤(3) 中,与划分方向T垂直的方向是指:如果划分方向T为X轴方向,则与划分方向T垂直的方向为 Y轴方向;如果划分方向T为Y轴方向,则与划分方向T垂直的方向为X轴方向。
【文档编号】G06F17/30GK105930414SQ201610240734
【公开日】2016年9月7日
【申请日】2016年4月19日
【发明人】林冰仙, 刘年涛, 周良辰
【申请人】南京师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1