點狀四叉樹

2021-05-28 01:14:46 字數 2239 閱讀 8649

定義:除葉子節點外,每個節點都有四個子結點。每個節點每有乙個對應的矩形區域。

如圖所示。

由上圖編寫四叉樹節點類

// 四叉樹節點型別結構

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圖形處理。對遊戲程式設計,這會很有用。本文著重於對四叉樹與八叉樹的原理與結構的介紹,幫助您在腦海中建立四叉樹與八叉樹的基本思想。本文並不...