前序
四叉樹或四元樹也被稱為q樹(q-tree)。四叉樹廣泛應用於影象處理、空間資料索引、2d中的快速碰撞檢測、儲存稀疏資料等,而八叉樹(octree)主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不對這兩種資料結構同時進行詳解,而只對四叉樹進行詳解,因為八叉樹的建立可由四叉樹的建立推得。若有不足之處,望能不吝指出,以改進之。^_^ 歡迎email:[email protected]
四叉樹與八叉樹的結構與原理
四叉樹(q-tree)是一種樹形資料結構。四叉樹的定義是:它的每個節點下至多可以有四個子節點,通常把一部分二維空間細分為四個象限或區域並把該區域裡的相關資訊存入到四叉樹節點中。這個區域可以是正方形、矩形或是任意形狀。以下為四叉樹的二維空間結構(左)和儲存結構(右)示意圖(注意節點顏色與網格邊框顏色):
四叉樹的每乙個節點代表乙個矩形區域(如上圖黑色的根節點代表最外圍黑色邊框的矩形區域),每乙個矩形區域又可劃分為四個小矩形區域,這四個小矩形區域作為四個子節點所代表的矩形區域。
較之四叉樹,八叉樹將場景從二維空間延伸到了三維空間。八叉樹(octree)的定義是:若不為空樹的話,樹中任一節點的子節點恰好只會有八個,或零個,也就是子節點不會有0與8以外的數目。那麼,這要用來做什麼?想象乙個立方體,我們最少可以切成多少個相同等分的小立方體?
答案就是8個
。如下八叉樹的結構示意圖所示:
四叉樹儲存結構的c語言描述:
[cpp]view plain
copy
print?
/*乙個矩形區域的象限劃分::
ul(1)|ur(0)
----------|-----------
ll(2)|lr(3)
以下對該象限型別的列舉
*/typedef
enum
quadrantenum;
/*矩形結構*/
typedef
structquadrect_t
quadrect_t;
/*四叉樹節點型別結構*/
typedef
structquadnode_t
quadnode_t;
/*四叉樹型別結構*/
typedef
structquadtree_t
quadtree_t;
/* 乙個矩形區域的象限劃分::
ul(1) | ur(0)
----------|-----------
ll(2) | lr(3)
以下對該象限型別的列舉
*/typedef enum
quadrantenum;
/* 矩形結構 */
typedef struct quadrect_t
quadrect_t;
/* 四叉樹節點型別結構 */
typedef struct quadnode_t
quadnode_t;
/* 四叉樹型別結構 */
typedef struct quadtree_t
quadtree_t;
四叉樹的建立
1、利用四叉樹分網格,如本文的第一張圖《四層完全四叉樹結構示意圖》,根據左圖的網格圖形建立如右圖所示的完全四叉樹。
偽碼:funtion quadtreebuild ( depth, rect )
funtion quadcreatebranch ( n, depth,rect )
}2、假設在乙個矩形區域裡有n個物件,如下左圖乙個黑點代表乙個物件,每個物件的座標位置都是已知的,用四叉樹的乙個節點儲存乙個物件,構建成如下右圖所示的四叉樹。
方法也是採用遞迴的方法對該矩形進行劃分分割槽塊,分完後再往裡分,直到每乙個子矩形區域裡只包含乙個物件為止。
偽碼:funtion quadtreebuild() ;
for (i = 1;i
剔除多餘的節點; //執行完上面迴圈後,四叉樹中可能有資料為空的葉子節點需要剔除}
funtion quadinsert(i,n) //該函式插入後四叉樹中的每個節點所儲存的物件數量不是1就是0
else if(節點n儲存了乙個物件)
else if(n節點資料為空)
}
(以上兩種建立方法作為舉一反三之用)
用四叉樹查詢某一物件
1、採用盲目搜尋,與二叉樹的遞迴遍歷類似,可採用後序遍歷或前序遍歷或中序遍歷對其進行搜尋某一物件,時間複雜度為o(n)。
2、根據物件在區域裡的位置來搜尋,採用分而治之思想,時間複雜度只與四叉樹的深度有關。比起盲目搜尋,這種搜尋在區域裡的物件越多時效果越明顯
偽碼:funtionfind ( n, pos, )
結語:
熟話說:結構之法,演算法之道。多一種資料結構就多一種解決問題的方法,多一種方法就多一種思維模式。祝君學習愉快!^_^
*********************************************=
參考:cs267: lecture 24, apr 11 1996
fast hierarchical methods for the n-body problem, part 1
四叉樹與八叉樹
前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...
四叉樹與八叉樹
前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...
四叉樹與八叉樹
前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...