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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

八叉树三维数据结构及示例程序Word格式文档下载.docx

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

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

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

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

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

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

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

8、存储坐标值。若需要的话还能从定位码中获取其坐标值(称解码);其三,在操作方面,所产生的定位码容易存储和执行,容易实现象集合、相加等组合操作。八叉树主要用来解决地理信息系统中的三维问题。#include stdafx.h#include fstream.hstdio.hstdlib.hmath.hoctree.h/* - */Vec3 makeVec3( double x, double y, double z) Vec3 v3 = (Vec3) malloc(3 * sizeof(double); v30 = x; v31 = y; v32 = z; return v3;Vec3 copyVe

9、c3( Vec3 src ) v30 = src0; v31 = src1; v32 = src2;Octree* make_octree( Vec3 min, Vec3 max ) /Octree* o = (Octree*) malloc(sizeof(Octree); Octree* o = new Octree; o-min = copyVec3(min);max = copyVec3(max);children = 0;at_max_depth = 0; /* printf(creating octree %.3lf,%.3lf,%.3lf . %.3lf,%.3lf,%.3lfn,

10、 min2, o-min1, o-min0,max2, o-max1, o-max0 ); */ return o;void subpoint( Octree* o,int oc,Vec3 min, Vec3 max) pvex_nor *m_p1,*m_p2; POSITION pos1,pos2; for(pos1=o-vex.GetHeadPosition(),pos2=o-normal.GetHeadPosition();pos1!=NULL;) /pos1=o-vex.FindIndex(i);/pos2=o-normal.FindIndex(i); m_p1=(pvex_nor*)

11、o-vex.GetNext(pos1);m_p2=(pvex_nor*)o-normal.GetNext(pos2); if(m_p1-xmin0&m_p1-xymin1&ymin2&zchildrenoc-vex.AddHead(new pvex_nor(m_p1-x,m_p1-y,m_p1-z);normal.AddHead(new pvex_nor(m_p2-x,m_p2-y,m_p2- void split_octree( Octree* o ) double oc_min3; double oc_max3; Vec3 mid = makeVec3( (o-min0 + o-max0)

12、 * 0.5, (o-min1 + o-max1) * 0.5, min2 + o-max2) * 0.5 ); int xp, yp, zp; int oc = 0; /o-children = (Octree*) malloc( 8 * sizeof(Octree*);children = new Octree*; for(zp=0; zp min2; oc_max2 = mid2; else oc_min2 = mid2; oc_max2 = o-max2; for(yp=0; yp min1; oc_max1 = mid1; oc_min1 = mid1; oc_max1 = o-ma

13、x1; for(xp=0; xp min0; oc_max0 = mid0; oc_min0 = mid0; oc_max0 = o-max0;children (zp*4) + (yp*2) + xp = make_octree( oc_min, oc_max ); subpoint( o,(zp*4) + (yp*2) + xp,oc_min,oc_max);int recursively_evaluate_octree( int min_depth, int max_depth, int current_depth, Octree* o ) int deepest_child = cur

14、rent_depth; /int xp, yp, zp; int oc; int cd; /pvex_nor *m_p; /POSITION pos; /*Vec3 point = makeVec3(0,0,0); int p = 0; point2 = (zp = 0) ?min2 : point1 = (yp = 0) ?min1 : point0 = (xp = 0) ?min0 :value p+ = evaluate_point( point,o);density=evaluate1_point(o); current_depth+;not_fully_divided = (char

15、) octree_needs_to_be_split( o ); if( current_depth = max_depth ) if( current_depth not_fully_divided ) /if(deepest_child=current_depth|deepest_child=0) / split_octree( o ); / for(oc = 0; oc x,m_p-y,m_p- */ / cd = recursively_evaluate_octree( min_depth, max_depth, current_depth, o-children oc ); / if

16、(cd deepest_child) deepest_child = cd;at_max_depth = 1; return deepest_child;int subdivide_octree( int min_depth, int max_depth, Octree* o ) return recursively_evaluate_octree(min_depth, max_depth, 0, o );double demo1( Vec3 pos ) /* demo 1: the surface is a sphere of radius 0.75 centered at 0,0,0 fu

17、nction returns 1.0 if point inside sphere, 0.0 otherwise double dist_sq = (pos0 * pos0) + (pos1 * pos1) + (pos2 * pos2); return ( dist_sq 0.5625 ) ? 1.0 : 0.0;double demo2( Vec3 pos ) /* demo 2: the surface is two spheres, A: radius 0.25 centered at -.25,-.5,0 and B: radius 0.5 centered at -0.5,0,0

18、function returns 1.0 if point inside sphere A, 2.0 for sphere B, 0.0 for neither double dist_sq_a = (pos0+.25) * (pos0+.25) + (pos1+.5) * (pos1+.5) + (pos2 * pos2); double dist_sq_b = (pos0+.8) * (pos0+.8) + (pos1 * pos1) + (pos2 * pos2); if( dist_sq_a = .0625 ) return 1.0; if( dist_sq_b = .25 ) ret

19、urn 2.0; return 0.0;double demo3( Vec3 pos ) /* demo 3: the surface is tiny sphere, radius 0.1 centered at -.5,.5,0 function returns 1.0 if point inside sphere A, 0.0 otherwise double dist_sq = (pos0+.5) * (pos0+.5) + (pos1-.5) * (pos1-.5) + (pos2 * pos2); 0.01 ) ?double demo4( Vec3 pos ) /* demo 4:

20、 wavey surface function returns 1.0 if point near surface , 0.0 otherwise double surface_height = sin( (pos0 * 3.0) ) * cos ( (pos1 * 3.0) ); double distance_sq = (pos2 - surface_height) * (pos2 - surface_height); return ( distance_sq double demo5( Vec3 pos ) /* demo 5: hemisphere, center 0,0,0 radi

21、us 0.5, cut by plane at z=0 double abs_dist_sq = (pos0) * (pos0) + (pos1) * (pos1) + (pos2 * pos2); double surf_dist_sq = abs_dist_sq - 0.5625; if(surf_dist_sq 0) & (surf_dist_sq 0.1 ) return .0;double demo6( Vec3 pos ) /* demo 6: another wavey surface double surface_height = sin( (pos0 * 2.0) ) + sin ( (pos1 * 2.0) ); double distance_sq = (pos2 - surface_height) * (pos2 - surface_

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

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