我需要實現一個空間數據結構來存儲矩形,然後能夠找到與給定矩形相交的所有矩形。這將在JavaScript中實現。遊戲的空間數據結構
到目前爲止,我正在開發一個四叉樹,以減少搜索空間,但因爲它是一個遊戲,即把所有的對象都需要更新其在樹中的位置。回到原點。
是否有任何數據結構或方法來幫助?它需要處理大約10,000個物體,所以蠻力不夠好。
我需要實現一個空間數據結構來存儲矩形,然後能夠找到與給定矩形相交的所有矩形。這將在JavaScript中實現。遊戲的空間數據結構
到目前爲止,我正在開發一個四叉樹,以減少搜索空間,但因爲它是一個遊戲,即把所有的對象都需要更新其在樹中的位置。回到原點。
是否有任何數據結構或方法來幫助?它需要處理大約10,000個物體,所以蠻力不夠好。
散列表與近似相交測試非常相似。散列表用作ODE中用於檢測衝突的更復雜算法的一部分。
從邏輯上講,這個測試整個空間劃分成規則的網格。每個網格單元都標有與該單元相交的對象列表。網格通過掃描所有對象進行初始化。我不知道JavaScript,所以我會用python-ish僞代碼。
for each ob in objects:
for each x in [floor(ob.x_min/grid_size) .. floor(ob.x_max/grid_size)]:
for each y in [floor(ob.y_min/grid_size) .. floor(ob.y_max/grid_size)]:
hashtable[hash(x, y)].append(ob)
要查找與給定對象的碰撞,請在散列表中查找接近碰撞,然後對每個對象應用精確的碰撞測試。
near_collisions = []
for each x in [floor(ob.x_min/grid_size) .. floor(ob.x_max/grid_size)]:
for each y in [floor(ob.y_min/grid_size) .. floor(ob.y_max/grid_size)]:
near_collisions = near_collisions ++ hashtable[hash(x, y)]
remove duplicates from near_collisions
for each ob2 in near_collisions:
if exact_collision_test(ob, ob2):
do_something
即使您有移動物體,您仍然可以使用四叉樹 - 每次移動物體或每次移動物體時都要移除並重新插入物體。
但四叉樹是不是在存儲矩形非常好,我會建議使用R-tree來代替。
爲什麼你提到quadtrees不是很擅長存儲矩形? – pavelkolodin 2016-04-11 14:26:26
@pavelkolodin因爲一個矩形可能跨越四叉樹中的區域邊界。在R樹中,區域具有可以重疊的靈活邊界,所以單個矩形總是可以屬於單個區域。 – svick 2016-04-11 16:03:09