定義:除葉子節點外,每個節點都有四個子結點。每個節點每有乙個對應的矩形區域。
如圖所示。
由上圖編寫四叉樹節點類
// 四叉樹節點型別結構
class quadnode
;
四叉樹類
class pointquadtree
;
3.構造四叉樹
此文採用逐個插入點,構建四叉樹。這裡,構造一顆四叉樹,首先要指定根節點的最大矩形。只為落在這個矩形範圍內的點編制索引。
首先確定插入方法。存存兩種插入方法:
(1)只要某個節點對應的矩形包含的點多於乙個,就要遞迴地對其進行分割。這種方法, 將點插入到樹的不同層次的節點中。
(2)所有插入點,存放在葉子結點中。
先判斷插入點是否在節點對應的矩形中。如果不在,則返回。如果在,則這個點一定在此節點的某個子節點中,就遞迴呼叫其子節點的插入演算法。
插入演算法**如下:
bool quadnode::insert(double x, double y, int depth)
/* 乙個矩形區域的象限劃分:
ul(1) | ur(0)
----------|-----------
ll(2) | lr(3)
*/--depth;
if (sub[0] == 0)
if(sub[0]->insert(x, y, depth))
return true;
if(sub[1]->insert(x, y, depth))
return true;
if(sub[2]->insert(x, y, depth))
return true;
if(sub[3]->insert(x, y, depth))
return true;
return false;
}
定義:找出落在矩形查詢範圍內的點,即是正交區域查詢問題。
4.1演算法分析
設查詢矩形為recfind
,節點的矩形為
recnode。
recfind與
recnode
有四種關係
c1:recnode包含
recfind
c2:recfind包含
recnode
c3:recfind與
recnode相交
c4:recfind與
recnode相離
分別討論這四種情況。
c1時,沒有必要遍歷
recnode
同級的其它三個節點了。只需在此節點對應的四個子節點中查詢即可。所圖
c1所示,查詢子節點
n1,n2,n3,n4。
c2時,
recnode
對應的葉子節點中的點都在
recfind
內,遞迴查詢
recnode
所有點。
c3時,如果
recfind
是葉子節點,就檢查葉子節點中儲存的點是否在
recfind
中。如果
recfind
不是葉子節點,就在此節點中繼續查詢,而後在同級的其它三個節點中查詢。因為
recfind
也可能也其它三個節點相交或包含。
c4時,就不用查了。
只有這四種情況,可按此四種分類編寫遞迴演算法,**如下
void quadnode::query(quadrect queryrect, std::vector& resultpts)
}return;
}for(int i = 0; i<4; ++i)
//[2]查詢矩形完全包含節點
//則遍歷這個節點以下的所有節點,記錄在resultnodes中
if(queryrect.contain(sub[i]->rect))
//[3]節點與查詢矩形相交
//查詢這個節點的子節點
if(queryrect.isintersect(sub[i]->rect))
}}
四叉樹的優點:(1)
矩形查詢僅與樹的規模和查詢矩形有關,與點的數量無關。
四叉樹的缺點:(1)
事先指定根節點矩形的最大範圍,即索引的最大範圍。
(2)當物件分布很不均勻時,索引效率低。
四叉樹與八叉樹
前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...
四叉樹與八叉樹
前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...
四叉樹與八叉樹
前序 四叉樹或四元樹也被稱為q樹 q tree 四叉樹廣泛應用於影象處理 空間資料索引 2d中的快速碰撞檢測 儲存稀疏資料等,而八叉樹 octree 主要應用於3d圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...