【问题标题】:Runtime for a collision-detection algorithm碰撞检测算法的运行时
【发布时间】:2016-06-02 17:58:17
【问题描述】:

我想出了一个算法来预测两个粒子之间的碰撞。给定一个矩形环境(宽度w,高度h),以及两个具有已知起始位置和速度的粒子,它可以确定

  • 这两个粒子是否会永远碰撞
  • 如果是这样,两个粒子下一次碰撞的时间

在有限的步骤中,可以说O(1)。通过扩展,它可以对O(n^2) 中的 n 个粒子执行此操作。这种方法有什么新颖之处吗?

我假设粒子以恒定速度线性移动并占据点(因此当两个粒子占据同一点时会发生碰撞)。

感谢您的帮助。

【问题讨论】:

  • 我认为检查所有粒子对确实需要 O(n(n+1)),即 O(n^2)。我认为没有更快的算法。
  • 这取决于你所说的“小说”是什么意思。这似乎是一个很简单的问题,你不太可能因此而变得富有和成名。但这也不是我过去见过的问题。
  • (假设粒子会从环境边缘反弹。如果没有,那么这当然是一个小问题。)

标签: algorithm collision-detection particles


【解决方案1】:

这是一个直截了当的解决方案,假设光栅化设置并且碰撞(粒子间或粒子壁)不会改变粒子的方向和速度。主要思想是将粒子的轨迹“绘制”成w x h大小的栅格。

allocate a raster of size w*h, each pixel being able to keep a list of (time,particle_id) tuples
for each particle pa
    for each pixel pi on the direction of pa
        store the tuple (time_of_pa_at_pi, pa_id) in the list of pi
for each pixel pi in the raster
    check for collisions inside the list of pi by ordering the tuples by time

最坏的情况很难描述,但性能的上限是O(n*max(w,h)) + O(wh) + max(w,h)*O(n*logn)。最坏的情况可能发生在所有粒子(或其中很大一部分)都在同一方向行进时。假设所有输入参数随机均匀分布,这是极不可能的。假设在一般情况下,性能应该会好很多。

另外(但这可能是这个答案的重要部分),如果您首先分配一个较小的栅格(例如大小为w/c x h/c)并以相同的方式运行可能的碰撞检查,您可以获得加速如上。此栅格中的像素较大,因此可能碰撞步骤所需的时间较少。在此步骤结束时,您可以了解每个宏观像素中可能发生的情况,然后在本地继续调查(以递归方式或使用其他技术)。上面的c 可以是whn 的常量或某个函数(例如c=sqrt(max(w,h)))。

当然,如果w 和/或h 大到不方便,上述所有方法都是无用的。

【讨论】:

  • 对于投反对票的人,你不喜欢/认为我回答的哪一部分“不合理”?
【解决方案2】:

很容易在 O(n^2) 时间内对 n 个粒子进行此操作,只需比较所有粒子对,并为每个粒子外推一条线段以查看它们碰撞的位置。

存在更高效的算法,通常基于使用诸如quadtree 之类的东西在内存中索引对象的想法; Wikipedia article on collision detection 很好地概述了另一种可能的方法。

【讨论】:

  • 感谢您的回复。我设计的算法也可以在 O(n) 的 n 维度(预测两个粒子之间的碰撞)中运行(要检查的确切案例数是 4(n-1) )。它可以证明两个粒子要么会在某个时间t发生碰撞,要么根本不会发生碰撞。这与现有方法有什么不同吗?
  • @vincemathic 您仍然可以简单地通过获取每对粒子并将它们的路径投影出来以找到它们的向量相交的位置,这是一个 O(1) 操作。我不知道这是否可以在少于 O(n^2) 的时间内完成,但是你可以在 O(n^2) 时间内完成 n^2 O(1) 次操作并不了不起!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多