问题描述
我有一个带有正坐标系的 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 (将#修改为@)