游戏的空间数据结构

时间:2010-11-13 13:19:47

标签: javascript data-structures spatial

我需要实现一个空间数据结构来存储矩形,然后才能找到与给定矩形相交的所有矩形。这将在JavaScript中实现。

到目前为止,我正在开发一个Quad Tree来减少搜索空间,但因为它是用于游戏,所有移动的对象都需要更新它在树中的位置。回到原点。

是否有任何数据结构或方法可以提供帮助?它需要处理大约10,000个物体,因此蛮力不够好。

2 个答案:

答案 0 :(得分:4)

哈希表作为近似交叉测试工作得相当好。散列表用作更复杂的算法的一部分,用于检测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

答案 1 :(得分:2)

即使你有移动物体,你仍然可以使用四叉树 - 每次移动物体或每次物体越过区域边界时,只需移除并重新插入物体。

但是四叉树不太适合存储矩形,我建议使用R-tree代替。