在我的wip游戏中,我必须实现Circle-Circle碰撞。为了实现这一点,我只需计算其中心(x1-x2)² + (y1-y2)²
之间的平方距离。如果它小于那么它们的方形半径(r1+r2)²
发生碰撞。但今天我看到了这个链接:
Circle-Circle collision
这里他们首先使用AABB碰撞来注意圈子是否在附近。但我为什么要这样做呢?圆圈碰撞是一个简单而不是非常昂贵的计算。当我首先使用AABB时,我至少进行相同数量的计算,如果圆圈接近甚至更多。
让我解释一下:
我对每个圆圈进行AABB碰撞检测。
所以我必须进行n! / (n-2)!
计算。 n =要测试的圆圈数。
对于每个AABB碰撞的圆对,我必须进行另一次计算,如果它们真的发生碰撞。
如果没有AABB碰撞检测,我只进行n! / (n-2)!
次计算,我不认为这种计算成本太高。
你觉得怎么样?
答案 0 :(得分:1)
我认为在平均情况下你可以在O(NlogN)中做到这一点,但最差的是O(N ^ 2): -
将每个圆圈视为2R * 2R的矩形,中心位于圆心。
对矩形使用扫描线算法,这是O(NlogN + R),其中是交叉点的数量。
- 醇>
可以使用O(R ^ 2)中的算法将交叉的矩形对检查为交叉圆。
注意:如果R很小则为O(NlogN),否则如果R = O(N)则为O(N ^ 2)
答案 1 :(得分:0)
This comment是正确的答案。这取决于您的硬件和编译器。如果您首先使用AABB检测,则需要进行8次+4次比较操作。如果你比较平方距离和方形半径,你做6加/减+ 3乘+ 1比较。也许你的硬件和编译器比较乘法比较快。但它不应该是性能上的巨大差异。如果您不使用平方根来比较平方(无论出于何种原因),您应该首先进行AABB比较,因为平方根计算需要一些时间。 还有更好的解决方案,如in this answer。如果您必须在许多对象之间进行许多检测,您可以考虑其中一种解决方案。