八叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2009年2月5日
读书2009-02-05 13:35:46 阅读68 评论2 字号:大中小订阅
§2.5 三维数据结构
目前GIS主要还停留在处理地球表面的数据,若数据是地表以下或以上,则先将它投影到地表,再进行处理,其实质是以二维的形式来模拟、处理任何数据,在有些领域可行,但涉及到三维问题的处理时,往往力不从心。
三维GIS的要求与二维GIS相似,但在数据采集,系统维护和界面设计等方面比二维GIS复杂得多,如三维数据的组织与重建,三维变换、查询、运算、分析、维护等方面。
下面主要介绍三维数据结构,三维数据结构表示有多种方法,其中运用最普遍的是具有拓扑关系的三维边界表示法和八叉树表示法。
一、八叉树三维数据结构
主要阐述八叉树三维数据结构的原理和常见的几种存贮结构。
(一)基本原理
用八叉树来表示三维形体,并研究在这种表示下的各种操作及应用是在进入80年代后才比较全面地开展起来的。
这种方法,既可以看成是四叉树方法在三维空间的推广,也可以认为是用三维体素阵列表示形体方法的一种改进。
八叉树的逻辑结构如下:
假设要表示的形体V可以放在一个充分大的正方体C内,C的边长为2 n,形体V C,它的八叉树可以用以下的递归方法来定义:
八叉树的每个节点与C的一个子立方体对应,树根与C本身相对应,如果V=C,那么V的八叉树仅有树根,如果V≠C,则将C等分为八个子立方体,每个子立方体与树根的一个子节点相对应。
只要某个子立方体不是完全空白或完全为V所占据,就要被八等分(图2-5-1),从而对应的节点也就有了八个子节点。
这样的递归判断、分割一直要进行到节点所对应的立方体或是完全空白,或是完全为V占据,或是其大小
已是预先定义的体素大小,并且对它与V之交作一定的“舍入”,使体素或认为是空白的,或认为是V占据的。
如此所生成的八叉树上的节点可分为三类:
灰节点,它对应的立方体部分地为V所占据;
白节点,它所对应的立方体中无V的内容;
黑节点,它所对应的立方体全为V所占据。
后两类又称为叶结点。
形体V关于C的八叉树的逻辑结构是这样的:它是一颗树,其上的节点要么是叶节点,要么就是有八个子节点的灰节点。
根节点与C相对应,其它节点与C的某个子立方体相对应。
因为八叉树的结构与四叉树的结构是如此的相似,所以八叉树的存贮结构方式可以完全沿用四叉树的有关方法。
因而,根据不同的存贮方式,八叉树也可以分别称为常规的、线性的、一对八的八叉树等等。
另外,由于这种方法充分利用了形体在空上的相关性,因此,一般来说,它所占用的存贮空间要比三维体素阵列的少。
但是实际上它还是使用了相当多的存贮,这并不是八叉树的主要优点。
这一方法的主要优点在于可以非常方便地实现有广泛用途的集合运算(例如可以求两个物体的并、交、差等运算),而这些恰是其它表示方法比较难以处理或者需要耗费许多计算资源的地方。
不仅如此,由于这种方法的有序性及分层性,因而对显示精度和速度的平衡、隐线和隐面的消除等,带来了很大的方便,特别有用。
(二)八叉树的存贮结构
八叉树有三种不同的存贮结构,分别是规则方式、线性方式以及一对八方式。
相应的八叉树也分别称为规则八叉树、线性八叉树以及一对八式八叉树。
不同的存贮结构的空间利用率及运算操作的方便性是不同的。
分析表明,一对八式八叉树优点更多一些。
1、规则八叉树
规则八叉树的存贮结构用一个有九个字段的记录来表示树中的每个结点。
其中一个字段用来描述该结点的特性(在目前假定下,只要描述它是灰、白、黑三类结点中哪一类即可),其余的八个字段用来作为存放指向其八个子结点的指针。
这是最普遍使用的表示树形数据的存贮结构方式。
规则八叉树缺陷较多,最大的问题是指针占用了大量的空间。
假定每个指针要用两个字节表示,而结点的描述用一个字节,那么存放指针要占总的存贮量的94%。
因此,这种方法虽然十分自然,容易掌握,但在存贮空间的使用率方面不很理想。
2、线性八叉树
线性八叉树注重考虑如何提高空间利用率。
用某一预先确定的次序遍历八叉树(例如以深度第一的方式),将八叉树转换成一个线性表(图2-5-2),表的每个元素与一个结点相对应。
对于结点的描述可以丰富一点,例如用适当的方式来说明它是否为叶结点,如果不是叶结点时还可用其八个子结点值的平均值作为非叶结点的值等等。
这样,可以在内存中以紧凑的方式来表示线性表,可以不用指针或者仅用一个指针表示即可。
线性八叉树不仅节省存贮空间,对某些运算也较为方便。
但是为此付出的代价是丧失了一定的灵活性。
例如为了存取属于原图形右下角的子图形对应的结点,那么必须先遍历了其余七个子图形对应的所有结点后才能进行;不能方便地以其它遍历方式对树的结点进行存取,导致了许多与此相关的运算效率变低。
因此尽管不少文章讨论了这种八叉树的应用,但是仍很难令人满意。
3、一对八式的八叉树
一个非叶结点有八个子结点,为了确定起见,将它们分别标记为0,1,2,3,4,5,6,7。
从上面的介绍可以看到,如果一个记录与一个结点相对应,那么在这个记录中描述的是这个结点的八个子结点的特性值。
而指针给出的则是该八个子结点所对应记录的存放处,而且还隐含地假定了这些子结点记录存放的次序。
也就是说,即使某个记录是不必要的(例如,该结点已是叶结点),那么相应的存贮位置也必须空闲在那里(图2-5-3),以保证不会错误地存取到其它同辈结点的记录。
这样当然会有一定的浪费,除非它是完全的八叉树,即所有的叶结点均在同一层次出现,而在该层次之上的所有层中的结点均为非叶结点。
为了克服这种缺陷,有两条途径可以采纳。
一是增加计算量,在记录中增加一定的信息,使计算工作适当减少或者更方便
二、三维边界表示法
介绍矢栅一体化数据结构的基本思想和概念
1、方法原理
首先考虑一个简单的四面体应如何表示。
它是一个平面多面体,即它的每个表面均可以看成是一个平面多边形。
为了做到无歧义地、有效地表示,需指出它的顶点位置以及由哪些点构成边,哪些边围成一个面等一些几何与拓扑的信息。
比较常用的表示一个平面多面体的方法是采用三张表来提供这些信息(如图2—5-4),这三张表就是:1)顶点表:用来表示多面体各顶点的坐标;
2)边表:指出构成多面体某边的两个顶点;
3)面表:给出围成多面体某个面的各条边。
对于后两个表一般使用指针的方法指出有关的边、点存放的位置。
为了更快地获得所需信息,更充分地表达点、线、面之间的拓扑关系,可以把其它一些有关的内容结合到所使用的表中。
图2—5-4中的扩充后的边表就是将边所属的多边形信息结合进边表中以后的形式。
这样利用这种扩充后的表,可知某条边是否为两个多边形的公共边,如果是,相应的两个多边形也立即知道。
这是一种用空间换取时间的方法。
是否要这样做,应视具体的应用而定,同样也可根据需要适当地扩充其它两张表来提高处理的效率。
除了描述它的几何结构,还要指出该多面体的一些其它特性。
例如每个面的颜色、纹理等等。
这些属性可以用另一个表独立存放。
当有若干个多面体时,还必须有一个对象表。
每个多面体在这个表中列出围成它的诸面,同样也可用指针的方式实现,这时面表中的内容,已不再是只和一个多面体有关。
2、特点
采用这种分列的表来表示多面体,可以避免重复地表示某些点、边、面,因此一般来说存贮量比较节省,对图形显示更有好处。
例如,由于使用了边表,可以立即显示出该多面体的线条画,也不会使同一条边重复地画上两次。
可以想象,如果表中仅有多边形表而省却了边表,两个多边形的公共边不仅在表示上要重复,而且很可能会画上两次。
类似地,如果省略了顶点表,那么作为一些边的公共顶点的坐标值就可能反复地写出好多次。
3、拓扑检查
对于比较复杂的多面体要输入大量的数据。
检查输入的数据是否一致、是否完全,是一项必不可少的工作,这就是通常所说的拓扑检查。
一般来说,在数据表中包含的信息越多,输入时有错的可能性也越大,但是可用来检查是否有错的手段也会随之增加。
对上面提及的数据结构,至少可以检查以下诸项:
1)顶点表中的每个顶点至少是两条边的端点;
2)每条边至少是一个多边形的边;
3)每个多边形是封闭的;
4)每个多边形至少有一条边是和另一个多边形共用的;
5)若边表中包含了指向它所属多边形的指针,那么指向该边的指针必在相应的多边形中出现。
这些检查对于维护表示多面体的数据库的全体一致性是有效的,而复杂的情况应当有专门的程序来检查。
4、应用
以上讨论的只是简单的平面多面体的三维边界表示,但是GIS研究的对象是自然实体,其三维形状的复杂程度难以描述。
例如岩石的外表不规则,组成的平面可有成千上万,如何用三维边界表示法表示呢?
从理论上讲,对任意的三维形体只要它满足一定的条件,总可找到一个适合的平面多面体来近似地表示这个三维形体,且使误差保持在一定的范围之内。
但是在实际上,这种逼近受到多方面因素的制约,解决这个问题的方法也不一而足。
通常,这个问题可以叙述成:要表示某个三维形体,又仅知道从这个形体的外表面S0上测得的一组点P1……Pn的坐标。
为了解决这个问题,首先要为这些点建立起某种关系。
这种关系被称为这些点代表的形体结构。
可以由一个图来表示,图的顶点就是这里给定的那组点P1……Pn,而图的边的给定方式则恰好反映了所设想的结构。
不同的图,有不同的边(也就是连接这些顶点的方法不同),相应地,这个图对应的平面多面体也不同,这可由图2—5-5来示意。
在众多的结构中,每个面均是三角形的平面多面体起着很重要的作用(这跟不规则三角网TIN很类似)。
即使对结构加上了这种限制,同一组点仍可得到不同的平面多面体。
因此,人们自然会想到,在这类多面体中,究竟在拥有了哪些特征之后,才能更确切地逼近原来的三维形体?有人认为表面积最小的多面体可能是适合的;也有人认为使用的准则应当和曲面S0的曲率有关。
至今,这是一个有待解决的问题。