微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将 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 举报,一经查实,本站将立刻删除。