ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:310.50KB ,
资源ID:4568811      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4568811.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(八叉树三维数据结构及示例程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

八叉树三维数据结构及示例程序.docx

1、八叉树三维数据结构及示例程序八叉树三维数据结构及示例程序八叉树三维数据结构(一)基本原理用八叉树来表示三维形体,并研究在这种表示下的各种操作及应用是在进入80年代后才比较全面地开展起来的。这种方法,既可以看成是四叉树方法在三维空间的推广,也可以认为是用三维体素阵列表示形体方法的一种改进。八叉树的逻辑结构如下:假设要表示的形体V可以放在一个充分大的正方体C内,C的边长为2 n,形体V C,它的八叉树可以用以下的递归方法来定义:八叉树的每个节点与C的一个子立方体对应,树根与C本身相对应,如果VC,那么V的八叉树仅有树根,如果VC,则将C等分为八个子立方体,每个子立方体与树根的一个子节点相对应。只要

2、某个子立方体不是完全空白或完全为V所占据,就要被八等分(图2-5-1),从而对应的节点也就有了八个子节点。这样的递归判断、分割一直要进行到节点所对应的立方体或是完全空白,或是完全为V占据,或是其大小已是预先定义的体素大小,并且对它与V之交作一定的“舍入”,使体素或认为是空白的,或认为是V占据的。如此所生成的八叉树上的节点可分为三类:灰节点,它对应的立方体部分地为V所占据;白节点,它所对应的立方体中无V的内容;黑节点,它所对应的立方体全为V所占据。后两类又称为叶结点。形体V关于C的八叉树的逻辑结构是这样的:它是一颗树,其上的节点要么是叶节点,要么就是有八个子节点的灰节点。根节点与C相对应,其它节

3、点与C的某个子立方体相对应。因为八叉树的结构与四叉树的结构是如此的相似,所以八叉树的存贮结构方式可以完全沿用四叉树的有关方法。因而,根据不同的存贮方式,八叉树也可以分别称为常规的、线性的、一对八的八叉树等等。另外,由于这种方法充分利用了形体在空上的相关性,因此,一般来说,它所占用的存贮空间要比三维体素阵列的少。但是实际上它还是使用了相当多的存贮,这并不是八叉树的主要优点。这一方法的主要优点在于可以非常方便地实现有广泛用途的集合运算(例如可以求两个物体的并、交、差等运算),而这些恰是其它表示方法比较难以处理或者需要耗费许多计算资源的地方。不仅如此,由于这种方法的有序性及分层性,因而对显示精度和速

4、度的平衡、隐线和隐面的消除等,带来了很大的方便,特别有用。(二)八叉树的存贮结构八叉树有三种不同的存贮结构,分别是规则方式、线性方式以及一对八方式。相应的八叉树也分别称为规则八叉树、线性八叉树以及一对八式八叉树。不同的存贮结构的空间利用率及运算操作的方便性是不同的。分析表明,一对八式八叉树优点更多一些。 1、规则八叉树规则八叉树的存贮结构用一个有九个字段的记录来表示树中的每个结点。其中一个字段用来描述该结点的特性(在目前假定下,只要描述它是灰、白、黑三类结点中哪一类即可),其余的八个字段用来作为存放指向其八个子结点的指针。这是最普遍使用的表示树形数据的存贮结构方式。规则八叉树缺陷较多,最大的问

5、题是指针占用了大量的空间。假定每个指针要用两个字节表示,而结点的描述用一个字节,那么存放指针要占总的存贮量的94。因此,这种方法虽然十分自然,容易掌握,但在存贮空间的使用率方面不很理想。2、线性八叉树线性八叉树注重考虑如何提高空间利用率。用某一预先确定的次序遍历八叉树(例如以深度第一的方式),将八叉树转换成一个线性表(图2-5-2),表的每个元素与一个结点相对应。对于结点的描述可以丰富一点,例如用适当的方式来说明它是否为叶结点,如果不是叶结点时还可用其八个子结点值的平均值作为非叶结点的值等等。这样,可以在内存中以紧凑的方式来表示线性表,可以不用指针或者仅用一个指针表示即可。线性八叉树不仅节省存

6、贮空间,对某些运算也较为方便。但是为此付出的代价是丧失了一定的灵活性。例如为了存取属于原图形右下角的子图形对应的结点,那么必须先遍历了其余七个子图形对应的所有结点后才能进行;不能方便地以其它遍历方式对树的结点进行存取,导致了许多与此相关的运算效率变低。因此尽管不少文章讨论了这种八叉树的应用,但是仍很难令人满意。3、一对八式的八叉树一个非叶结点有八个子结点,为了确定起见,将它们分别标记为0,1,2,3,4,5,6,7。从上面的介绍可以看到,如果一个记录与一个结点相对应,那么在这个记录中描述的是这个结点的八个子结点的特性值。而指针给出的则是该八个子结点所对应记录的存放处,而且还隐含地假定了这些子结

7、点记录存放的次序。也就是说,即使某个记录是不必要的(例如,该结点已是叶结点),那么相应的存贮位置也必须空闲在那里(图2-5-3),以保证不会错误地存取到其它同辈结点的记录。这样当然会有一定的浪费,除非它是完全的八叉树,即所有的叶结点均在同一层次出现,而在该层次之上的所有层中的结点均为非叶结点。为了克服这种缺陷,有两条途径可以采纳。一是增加计算量,在记录中增加一定的信息,使计算工作适当减少或者更方便。栅格数据压缩存储方式之四叉树、八叉树编码四叉树编码(quad-tree code) 四又树结构的基本思想是将一幅栅格地图或图像等分为四部分。逐块检查其格网属性值(或灰度)。如果某个子区的所有格网值都

8、具有相同的值。则这个子区就不再继续分割,否则还要把这个子区再分割成四个子区。这样依次地分割,直到每个子块都只含有相同的属性值或灰度为止。四叉树编码法有许多有趣的优点:容易而有效地计算多边形的数量特征;阵列各部分的分辨率是可变的,边界复杂部分四叉树较高即分级多,分辨率也高,而不需表示许多细节的部分则分级少,分辨率低,因而既可精确表示图形结构又可减少存贮量;栅格到四叉树及四叉树到简单栅格结构的转换比其它压缩方法容易;多边形中嵌套异类小多边形的表示较方便。四叉树编码的最大缺点是转换的不定性,用同一形状和大小的多边形可能得出多种不同的四叉树结构,故不利于形状分析和模式识别。但因它允许多边形中嵌套多边形

9、即所谓“洞”这种结构存在,使越来越多的地理信息系统工作者都对四叉树结构很感兴趣。上述这些压缩数据的方法应视图形的复杂情况合理选用,同时应在系统中备有相应的程序。另外,用户的分析目的和分析方法也决定着压缩方法的选取。四叉树结构按其编码的方法不同又分为常规四叉树和线性四叉树。常规四叉树除了记录叶结点之外,还要记录中间结点。结点之间借助指针联系,每个结点需要用六个量表达:四个叶结点指针,一个父结点指针和一个结点的属性或灰度值。这些指针不仅增加了数据贮存量,而且增加了操作的复杂性。常规四叉树主要在数据索引和图幅索引等方面应用。线性四叉树则只存贮最后叶结点的信息。包括叶结点的位置、深度和本结点的属性或灰

10、度值。所谓深度是指处于四叉树的第几层上。由深度可推知子区的大小。线性四叉树叶结点的编号需要遵循一定的规则,这种编号称为地址码,它隐含了叶结点的位置和深度信息。最常用的地址码是四进制或十进制的Morton码。八叉树结构就是将空间区域不断地分解为八个同样大小的子区域(即将一个六面的立方体再分解为八个相同大小的小立方体),分解的次数越多,子区域就越小,一直到同区域的属性单一为止。按从下而上合并的方式来说,就是将研究区空间先按定的分辨率将三维空间划分为三维栅格网,然后按规定的顺序每次比较3个相邻的栅格单元,如果其属性值相同则合并,否则就记盘。依次递归运算,直到每个子区域均为单值为止。八叉树同样可分为常

11、规八叉树和线性八叉树。常规八叉树的结点要记录十个位,即八个指向子结点的指针,个指向父结点的指针和一个属性值(或标识号)。而线性八叉树则只需要记录叶结点的地址码和属性值。因此,它的主要优点是,其一节省存储空间,因为只需对叶结点编码,节省了大量中间结点的存储。每个结点的指针也免除了,而从根到某一特定结点的方向和路径的信息隐含在定位码之中,定位码数字的个位数显示分辨率的高低或分解程度;其次,线性八叉树可直接寻址,通过其坐标值则能计算出任何输入结点的定位码(称编码),而不必实际建立八叉树,并且定位码本身就是坐标的另种形式,不必有意去存储坐标值。若需要的话还能从定位码中获取其坐标值(称解码);其三,在操

12、作方面,所产生的定位码容易存储和执行,容易实现象集合、相加等组合操作。八叉树主要用来解决地理信息系统中的三维问题。#include #include #include #include #include #include #include /* - */* - */Vec3 makeVec3( double x, double y, double z) Vec3 v3 = (Vec3) malloc(3 * sizeof(double); v30 = x; v31 = y; v32 = z; return v3;Vec3 copyVec3( Vec3 src ) Vec3 v3 = (Vec3

13、) malloc(3 * sizeof(double); v30 = src0; v31 = src1; v32 = src2; return v3;/* - */Octree* make_octree( Vec3 min, Vec3 max ) lf,%.3lf,%.3lf . %.3lf,%.3lf,%.3lfn, o-min2, o-min1, o-min0, o-max2, o-max1, o-max0 ); */ return o;void subpoint( Octree* o,int oc,Vec3 min, Vec3 max) pvex_nor *m_p1,*m_p2; POS

14、ITION pos1,pos2; for(pos1=o-(),pos2=o-();pos1!=NULL;) etHeadPosition(); pos != NULL; ) m_p=(pvex_nor*)vexoc.GetNext( pos ); (new pvex_nor(m_p-x,m_p-y,m_p-z); */ 5) * (pos0+.25) + (pos1+.5) * (pos1+.5) + (pos2 * pos2); double dist_sq_b = (pos0+.8) * (pos0+.8) + (pos1 * pos1) + (pos2 * pos2); if( dist

15、_sq_a = .0625 ) return ; if( dist_sq_b = .25 ) return ; return ;double demo3( Vec3 pos ) /* demo 3: the surface is tiny sphere, radius centered at ,.5,0 function returns if point inside sphere A, otherwise */ double dist_sq = (pos0+.5) * (pos0+.5) + (pos1 * (pos1) + (pos2 * pos2); return ( dist_sq )

16、 : ;double demo4( Vec3 pos ) /* demo 4: wavey surface function returns if point near surface , otherwise */ double surface_height = sin( (pos0 * ) * cos ( (pos1 * ); double distance_sq = (pos2 - surface_height) * (pos2 - surface_height); return ( distance_sq ) : ;double demo5( Vec3 pos ) /* demo 5:

17、hemisphere, center 0,0,0 radius , cut by plane at z=0 */ double abs_dist_sq = (pos0) * (pos0) + (pos1) * (pos1) + (pos2 * pos2); double surf_dist_sq = abs_dist_sq - ; if(surf_dist_sq 0) & (surf_dist_sq ) return ; else return .0;double demo6( Vec3 pos ) /* demo 6: another wavey surface function retur

18、ns if point near surface , otherwise */ double surface_height = sin( (pos0 * ) + sin ( (pos1 * ); double distance_sq = (pos2 - surface_height) * (pos2 - surface_height); return ( distance_sq ) : ;double demo7( Vec3 pos ) /* demo 7: a cylinder function returns if point near surface , otherwise */ dou

19、ble disc_dist_sq = (pos1) * (pos1) + (pos2 * pos2); double surf_dist_sq = disc_dist_sq - ; if(surf_dist_sq ) & ( pos0 ) ) if( surf_dist_sq | (pos2 ) return .0; zr = cr = (pos0 * ; zi = ci = (pos1 * ; while(it_count max_iters) & (inside) /* z = z2 + c */ it_count+; new_zr = (zr*zr) - (zi*zi) + cr; ne

20、w_zi = (2*zr*zi) + ci; zr = new_zr; zi = new_zi; inside = (zr * zr) + (zi * zi) * 20); return (it_count = max_iters) : ; double demo9( Vec3 pos, Octree *o) pvex_nor *m_p1,*m_p2; POSITION po; double dis; double zx,zy,zz,tempx,tempy,tempz,temp; for(int i=0;i();i+) po=o-(i); m_p1=(pvex_nor *)o-(po); m_

21、p2=(pvex_nor *)o-(po); tempx=pos0-m_p1-x;tempy=pos1-m_p1-y;tempz=pos2-m_p1-z; temp=tempx*m_p2-x+tempy*m_p2-y+tempz*m_p2-z; zx=m_p1-x-temp*m_p2-x;zy=m_p1-y-temp*m_p2-y;zz=m_p1-z-temp*m_p2-z; dis=sqrt(pos0-zx)*(pos0-zx)+(pos1-zy)*(pos1-zy)+(pos2-zz)*(pos2-zz); 7 is different to corner 0 then the funct

22、ion returns 1)*/int octree_needs_to_be_split( Octree* o ) /*int i; double v = o-value0; for(i=1; i valuei != v) return 1; /* if we got here, then all corners have the same value */ Return the number of triangular facets, the array triangles will be loaded up with the vertices at most 5 triangular fa

23、cets. 0 will be returned if the grid cell is either totally above of totally below the isolevel.*/int Polygonise(GRIDCELL grid,double isolevel,TRIANGLE *triangles) int i,ntriang; int cubeindex; Vec3 vertlist12; int edgeTable256= 0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0x

24、a0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0

25、x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,

26、0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0xcc , 0x1c5, 0x2cf,

27、 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f

28、, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1