快速圆碰撞检测

我正在尝试编写一个方法来计算两个圆圈是否重叠。我想出了以下内容,我只是好奇地想知道是否有进一步优化。

private static boolean isCollision(Point2D p1, float r1, Point2D p2, float r2)
{
    float a,dx, dy;
    a = (r1+r2) * (r1+r2);
    dx = (float) (p1.getX() - p2.getX());
    dy = (float) (p1.getY() - p2.getY());

    if (a > (dx*dx) + (dy*dy))
    {
        return true;
    }
    return false;
}

答案 1

嗯。就数学而言,这看起来相当不错。关于如何使Java方面更快,更简洁的一些小问题:

  • 如果您使用双打而不是浮动作为半径,则不必将双精度下放到浮动。
  • 如果您专门要求使用 Point2D.Double 参数,则可以使用其 x 和 y 公共字段,而不是使用 getter。
  • 另外,为什么只是做!if (foo) { return true; } else { return false; }?return foo;

改进的版本,然后:

private static boolean isCollision(Point2D.Double p1, double r1, Point2D.Double p2, double r2)
{
    final double a = r1 + r2;
    final double dx = p1.x - p2.x;
    final double dy = p1.y - p2.y;
    return a * a > (dx * dx + dy * dy);
}

(请注意,如果您的代码完全基于浮点数,则可以对 和 执行相同的操作。Point2D.Floatfloat


答案 2

重叠还是相交?

如果相交,不要忘记圆圈不相交的情况,因为它们彼此内部。

如果它是重叠的,我真的看不出你如何进一步优化;您正在将点距离与半径之和进行比较,使用距离平方以避免取平方根。似乎没有任何脂肪需要修剪。


推荐