四叉樹平面分割算法--快速圖元搜索


環境:Visual Studio 2017 + .Net Framework 4.5 + C#

用途:在二維平面上快速定位某個點有哪些圖元。

算法說明:

  1,平面分割

    本文使用完全四叉樹算法(除了葉節點之外,每個節點都包含四個子節點),對平面進行分割。

    每添加一個圖元,判斷當前象限(本文把每個節點稱之為象限/Quadrant,根節點,即整個畫布也是一個象限)中的圖元個數,

    如果當前象限中的圖元超出某個閾值(假設,每個象限最多包含四個圖元),則對象限進行分割(分割為四個子象限)。

    然后,把當前象限中的圖元放到子象限中(把圖元數據從當前象限移到子象限中)。假如,子象限的Rectangle不足以包含整個

    圖元,則不移動。

  2,圖元搜索

    給定一個點(Point),從根節點開始搜索,判斷根節點中的圖元(的Rectangle)是否包含給定的點(Point)。如果包含,則

    把整個圖元添加到結果集中,否則判斷四個子象限(四個子節點)是否包含給定的點(Point),再判斷其內部的圖元是否包含

    這個點。重復此過程,直至象限沒有子象限。

 

下面展示一下四叉樹搜索和線性表搜索算法時間效率的對比:

在畫布上創建10000個圓作為測試圖元。

1,四叉樹搜索

時間(毫秒):

添加圖元用時:37毫秒

搜索圖元,第一次用時29毫秒,后續搜素都是個位數耗時。主要應該是CPU緩存的原因,后續連續搜索都是暖緩存,所以效率很高。

 

2,線性搜索(List,並且沒有使用Parallel加速)

時間(毫秒):

 

添加圖元用時:46毫秒

每次搜索圖元的時間效率差別不大,基本都在55到60之間。

 

項目代碼

 

聲明:所有代碼僅為本人做測試用途,如果使用此代碼導致任何問題,本人概不負責。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM