環境: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之間。
聲明:所有代碼僅為本人做測試用途,如果使用此代碼導致任何問題,本人概不負責。