最近利用OpenGL實現了一個簡單的四叉樹,對視窗進行分割。
資料結構:
AreaType m_bounds;<br />rectContainer m_contents;<br />pointerType m_nodes[4];
m_bounds是節點的矩形包圍盒, m_nodes數組儲存四個孩子的節點指標, m_contents儲存那些不包含於四個孩子但是包含於當前節點的地區,也就是那些我們插入的地區(假設使用的是矩形)。
如:是一個節點的內容:
寫成一般的樹狀圖是:
演算法描述:
插入一個矩形地區到四叉樹中:
1 將當前節點細分,添加四個孩子節點:
m_nodes[LUp] = new QuadTreeNode( TRectanglef(m_bounds.GetPos(),<br />Vec2f(halfWidth, halfHeight)) );<br />m_nodes[LDown] = new QuadTreeNode( TRectanglef(Vec2f(m_bounds.m_Left,<br />m_bounds.m_Top + halfHeight), Vec2f(halfWidth, halfHeight)) );<br />m_nodes[RUp] = new QuadTreeNode( TRectanglef(Vec2f(m_bounds.m_Left + halfWidth,<br />m_bounds.m_Top), Vec2f(halfWidth, halfHeight)) );<br />m_nodes[RDown] = new QuadTreeNode( TRectanglef(<br />Vec2f(m_bounds.m_Left + halfWidth,<br />m_bounds.m_Top + halfHeight), Vec2f(halfWidth, halfHeight)) );<br />
2 如果要插入的矩形屬於地區某個孩子節點,則遞迴深入,繼續細分該孩子節點。
3 直到該地區不屬於任何孩子節點時候,直接存放到當前節點的content數組中。
查詢一個矩形地區在四叉樹中:
返回所有與該地區相交或者包含的地區,以一個vector的新式。
程式:
滑鼠左鍵拖出橢圓,地區同時將這些地區插入到四叉樹中:
右鍵拖出一個白色框選擇地區,進行查詢:
查詢結果為:
這裡沒法上傳檔案。具體demo可以到我的資源裡下載。
http://download.csdn.net/source/1239943