八叉樹演算法

2021-09-30 10:34:52 字數 3052 閱讀 6341

octree的定義是:若不為空樹的話,樹中任一節點的子節點恰好只會有八個,或

零個,也就是子節點不會有0與8以外的數目。那麼,這要用來做什麼?想象乙個

立方體,我們最少可以切成多少個相同等分的小立方體?答案就是8個。再想象

我們有乙個房間,房間裡某個角落藏著一枚金幣,我們想很快的把金幣找出來,

聰明的你會怎麼做?我們可以把房間當成乙個立方體,先切成八個小立方體,

然後排除掉沒有放任何東西的小立方體,再把有可能藏金幣的小立方體繼續切八

等份….如此下去,平均在log8(房間內的所有物品數)的時間內就可找到金幣。

因此,octree就是用在3d空間中的場景管理,可以很快地知道物體在3d場景中

的位置,或偵測與其它物體是否有碰撞以及是否在可視範圍內。

2、實現octree的原理

(1). 設定最大遞迴深度

(2). 找出場景的最大尺寸,並以此尺寸建立第乙個立方體

(3). 依序將單位元元素丟入能被包含且沒有子節點的立方體

(4). 若沒有達到最大遞迴深度,就進行細分八等份,再將該立方體所裝的單位元元素全部分擔給八

個子立方體

(5). 若發現子立方體所分配到的單位元元素數量不為零且跟父立方體是一樣的,則該子立方體停止

細分,因為跟據空間分割理論,細分的空間所得到的分配必定較少,若是一樣數目,則再怎麼切數目

還是一樣,會造成無窮切割的情形。

(6). 重複3,直到達到最大遞迴深度。

4、bsp tree和octree對比

a) bsp tree將場景分割為1個面,而octree分割為3個面。

b) bsp tree每個節點最多有2個子結點,而octree最多有8個子結點

因此bsp tree可以用在不論幾唯的場景中,而octree則常用於三維場景

[cpp]view plain

copy

#include "stdafx.h"

#include 

using

namespace

std;  

//定義八叉樹節點類

template

<

class

t>  

struct

octreenode  

};  

//建立八叉樹

template

<

class

t>  

void

createoctree(octreenode* &root,

intmaxdepth,

double

xmin,

double

xmax,

double

ymin,

double

ymax,

double

zmin,

double

zmax)  

}  inti=1;  

//先序遍歷八叉樹

template

<

class

t>  

void

preorder( octreenode* & p)  

}  //求八叉樹的深度

template

<

class

t>  

intdepth(octreenode*& p)  

//計算單位長度,為查詢點做準備

intcal(

intnum)  

return

result;  

}  //查詢點

intmaxdepth=0;  

inttimes=0;  

static

double

xmin=0,xmax=0,ymin=0,ymax=0,zmin=0,zmax=0;  

inttmaxdepth=0;  

double

txm=1,tym=1,tzm=1;  

template

<

class

t>  

void

find(octreenode*& p,

double

x,double

y,double

z)  

if(x<=p->xmin+txm && x>=p->xmax-txm && y<=p->ymin+tym && y>=p->ymax-tym && z<=p->zmin+tzm && z>=p->zmax-tzm )  

else

if(x<(p->xmax-xm) && y<(p->ymax-ym) && z<(p->zmax-zm))  

else

if(x<(p->xmax-xm) && y<(p->ymax-ym) && z>(p->zmax-zm))  

else

if(x>(p->xmax-xm) && y<(p->ymax-ym) && z<(p->zmax-zm))  

else

if(x>(p->xmax-xm) && y<(p->ymax-ym) && z>(p->zmax-zm))  

else

if(x<(p->xmax-xm) && y>(p->ymax-ym) && z<(p->zmax-zm))  

else

if(x<(p->xmax-xm) && y>(p->ymax-ym) && z>(p->zmax-zm))  

else

if(x>(p->xmax-xm) && y>(p->ymax-ym) && z<(p->zmax-zm))  

else

if(x>(p->xmax-xm) && y>(p->ymax-ym) && z>(p->zmax-zm))  

}  //main函式

intmain ()  

else

}  else

if(choiced == 2)  

else

if(choiced == 3)  

else

if(choiced == 4)  

else

}  }  

四叉樹與八叉樹

前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...

四叉樹與八叉樹

前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...

四叉樹與八叉樹

前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...