为什么我应该使用AABB进行圆圈碰撞

时间:2014-01-15 09:48:56

标签: algorithm collision-detection geometry aabb

在我的wip游戏中,我必须实现Circle-Circle碰撞。为了实现这一点,我只需计算其中心(x1-x2)² + (y1-y2)²之间的平方距离。如果它小于那么它们的方形半径(r1+r2)²发生碰撞。但今天我看到了这个链接: Circle-Circle collision

这里他们首先使用AABB碰撞来注意圈子是否在附近。但我为什么要这样做呢?圆圈碰撞是一个简单而不是非常昂贵的计算。当我首先使用AABB时,我至少进行相同数量的计算,如果圆圈接近甚至更多。

让我解释一下:

我对每个圆圈进行AABB碰撞检测。 所以我必须进行n! / (n-2)!计算。 n =要测试的圆圈数。 对于每个AABB碰撞的圆对,我必须进行另一次计算,如果它们真的发生碰撞。

如果没有AABB碰撞检测,我只进行n! / (n-2)!次计算,我不认为这种计算成本太高。 你觉得怎么样?

2 个答案:

答案 0 :(得分:1)

我认为在平均情况下你可以在O(NlogN)中做到这一点,但最差的是O(N ^ 2): -

  
      
  1. 将每个圆圈视为2R * 2R的矩形,中心位于圆心。

  2.   
  3. 对矩形使用扫描线算法,这是O(NlogN + R),其中是交叉点的数量。

  4.   
  5. 可以使用O(R ^ 2)中的算法将交叉的矩形对检查为交叉圆。

  6.   

注意:如果R很小则为O(NlogN),否则如果R = O(N)则为O(N ^ 2)

答案 1 :(得分:0)

This comment是正确的答案。这取决于您的硬件和编译器。如果您首先使用AABB检测,则需要进行8次+4次比较操作。如果你比较平方距离和方形半径,你做6加/减+ 3乘+ 1比较。也许你的硬件和编译器比较乘法比较快。但它不应该是性能上的巨大差异。如果您不使用平方根来比较平方(无论出于何种原因),您应该首先进行AABB比较,因为平方根计算需要一些时间。 还有更好的解决方案,如in this answer。如果您必须在许多对象之间进行许多检测,您可以考虑其中一种解决方案。