将 2D 物理碰撞测试限制/限制为仅附近对象的数据结构?

问题描述

我有一个带有正坐标系的 2D 世界。 (0,0) 是地图的左上角每个对象都有正坐标

例如,在以下像素阵列中,A 是 (0,0) 处的原点B 是 (4,3) 处的对象。。 >

  0 1 2 3 4 5 6 7 8
0 A - - - - - - - -
1 - - - - - - - - -
2 - - - - - - - - -
3 - - - - B - - - -
4 - - - - - - - - -
5 - - - - - - - - -
6 - - - - - - - - -

接下来,每个对象都有一个 (x,y) 位置以及一个宽度和高度

(x,y) 位置是对象的左上角,它跨越一定宽度的右侧和特定的高度。

让我们在 (4,3) 处取 B,宽度为 3,高度为 3。因此,B 在地图上占据以下空间:

  0 1 2 3 4 5 6 7 8
0 A - - - - - - - -
1 - - - - - - - - -
2 - - - - - - - - -
3 - - - - +---+ - -
4 - - - - | B | - -
5 - - - - +---+ - -
6 - - - - - - - - -

接下来,让我们假设我可以清楚地确定两个物体是否发生碰撞

但是有 5,000 个对象。我可以轻松实现一个非常幼稚的方法,例如:

for each object o in world:
  for each object j in world:
    if o != j and o.collides(j):
      print: Collision between o and j!

然而,这显然是一个带有传统列表的O(n^2)方法。如果我使用二叉搜索树或排序数组来存储所有对象,我可以将其减少到 O(nlogn) 因为搜索 BST 和排序数组是一个 O(logn) 操作。

这绝对是我能做到的最好的吗?没有更好的方法可以做到这一点吗?有没有办法减少 B 可以碰撞的物体数量

由于 B 的宽度和高度只有 3,3,显然它仅限于与其边界 3 内的对象交互。这可能是限制它可能与之交互的物理对象的关键吗?

代码不是必需的,除非你感觉很好。我对理论和我的选择更感兴趣。欢迎任何讨论。谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)