八叉树管理原理_第1页
八叉树管理原理_第2页
八叉树管理原理_第3页
八叉树管理原理_第4页
八叉树管理原理_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

八叉树管理原理八叉树管理原理八叉树管理原理八叉树管理原理编制仅供参考审核批准生效日期地址:电话:传真:邮编:八叉树三维数据结构(一)基本原理用八叉树来表示三维形体,并研究在这种表示下的各种操作及应用是在进入80年代后才比较全面地开展起来的。这种方法,既可以看成是四叉树方法在三维空间的推广,也可以认为是用三维体素阵列表示形体方法的一种改进。八叉树的逻辑结构如下:假设要表示的形体V可以放在一个充分大的正方体C内,C的边长为2n,形体VC,它的八叉树可以用以下的递归方法来定义:八叉树的每个节点与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),以保证不会错误地存取到其它同辈结点的记录。这样当然会有一定的浪费,除非它是完全的八叉树,即所有的叶结点均在同一层次出现,而在该层次之上的所有层中的结点均为非叶结点。为了克服这种缺陷,有两条途径可以采纳。一是增加计算量,在记录中增加一定的信息,使计算工作适当减少或者更方便。

前节点的值为:"<<p->data<<"/n坐标为:";cout<<"xmin:"<<p->xmin<<"xmax:"<<p->xmax;cout<<"ymin:"<<p->ymin<<"ymax:"<<p->ymax;cout<<"zmin:"<<p->zmin<<"zmax:"<<p->zmax;i+=1;cout<<endl;preOrder(p->top_left_front);preOrder(p->top_left_back);preOrder(p->top_right_front);preOrder(p->top_right_back);preOrder(p->bottom_left_front);preOrder(p->bottom_left_back);preOrder(p->bottom_right_front);preOrder(p->bottom_right_back);cout<<endl;}}建八叉树2.先序遍历八叉树/n";cout<<"3.查看树深度4.查找节点/n";cout<<"0.退出/n/n";cin>>choiced;if(choiced==0)return0;elseif(choiced==1){system("cls");cout<<"请输入最大递归深度:"<<endl;cin>>maxdepth;cout<<"请输入外包盒坐标,顺序如下:xmin,xmax,ymin,ymax,zmin,zmax"<<endl;cin>>xmin>>xmax>>ymin>>ymax>>zmin>>zmax;if(maxdepth>=0||xmax>xmin||ymax>ymin||zmax>zmin||xmin>0||ymin>0||zmin>0){tmaxdepth=cal(maxdepth);txm=(xmax-xmin)/tmaxdepth;tym=(ymax-ymin)/tmaxdepth;tzm=(zmax-zmin)/tmaxdepth;createOctree(rootNode,maxdepth,xmin,xmax,ymin,ymax,zmin,zmax);}else{cout<<"输入错误!";return0;}}elseif(choiced==2){system("cls");cout<<"先序遍历八叉树结果:/n";i=1;preOrder(rootNode);cout<<endl;system("pause");}elseif(choiced==3){system("cls");intdep=depth(rootNode);cout<<"此八叉树的深度为"<<dep+1<<endl;system("pause");}elseif(choiced==4){system("cls");cout<<"请输入您希望查找的点的坐标,顺序如下:x,y,z/n";doublex,y,z;cin>>x>>y>>z;times=0;cout<<endl<<"开始搜寻该点……"<<endl;find(rootNode,x,y,z);system("pause");}else{system("cls");cout<<"/n/n错误选择!/n";system("pause");}}}

关于三维场景八叉树的初步想法今天建冰跟我提起了一个很有意思的东西:八叉树把一个立方体切三刀,横一刀,竖两刀(按坐标轴的方向切),就变成8个边长为一半的立方体。再切一次小立方体,在分成8块。。。一直往下递归,这就可以使用一个八叉树储存。八叉树储存的好处:1.在没有东西的立方体,就不用再往下切,能节省储存空间,运算资源2.管理方便,搜索某一个小方块的时候,能很方便的使用二分法查找3.深度到一定层次以后,基本可以拟合所有的三维模型。对八叉树的使用的初步想法:首先,对一个三维游戏的空间来说,z维的使用远比x、y维少。若x、y维使用范围是0-1024,z维用到128就足够了(当然这是在地面游戏的基础上,不包括空战)。所以,为了减少八叉树的层次,我们可以对八叉树做一点点扩充:第一层不作为八叉树的分叉储存,储存一个平面。这是一个由立方体拼成的平面。大家可以想象一下平面拼起来的麻将。从第二层开始,就是真正意义上的八叉树,第一层平面上的每一个立方体,都是八叉树的根节点,然后往下细分。假如场景需要为1024*1024*128,这只需要第一层4*4的立方体,然后每个立方体对应7层的八叉树即可。对比起全八叉树,只能形成1024*1024*1024的空间,需要10层的八叉树,节约了3层。其次,对于场景里面的物体操作。物体可以用一个小八叉树储存(八叉树again),当然这个八叉树的层次会少很多,最多不过5层。在场景中,以某一个元点(譬如八叉树的最左叶节点)作为场景的定位,然后判断与场景相交,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论