在java中查找两个圆圈之间距离的最有效方法?

2022-09-03 13:25:34

因此,显然计算平方根不是很有效,这让我想知道找出两个圆之间的距离(我在下面称之为范围)的最佳方法是什么?

Find range between two circles

所以通常我会计算:

a^2 + b^2 = c^2
dy^2 + dx^2 = h^2
dy^2 + dx^2 = (r1 + r2 + range)^2
(dy^2 + dx^2)^0.5 = r1 + r2 + range
range = (dy^2 + dx^2)^0.5 - r1 - r2

当您只查找“范围”为0表示冲突的情况时,尝试避免平方根工作正常:

 if ( (r1 + r2 + 0 )^2 > (dy^2 + dx^2) )

但是,如果我试图计算出这个范围距离,我最终会得到一些笨拙的方程,比如:

 range(range + 2r1 + 2r2) = dy^2 + dx^2 - (r1^2 + r2^2 + 2r1r2)

这不会去任何地方。至少我不知道如何从这里解决它的范围...

那么显而易见的答案是三角测量,并首先找到θ:

  Tan(theta) = dy/dx
  theta = dy/dx * Tan^-1

然后找到 hypotemuse Sin(theta) = dy/h h = dy/Sin(theta)

最后计算出范围范围 + r1 + r2 = dy/Sin(theta) 范围 = dy/Sin(theta) - r1 - r2

这就是我所做的,并且有一个看起来像这样的方法:

private int findRangeToTarget(ShipEntity ship, CircularEntity target){


    //get the relevant locations
    double shipX = ship.getX();
    double shipY = ship.getY();
    double targetX =  target.getX();
    double targetY =  target.getY();
    int shipRadius = ship.getRadius();
    int targetRadius = target.getRadius();

    //get the difference in locations:
    double dX = shipX - targetX;
    double dY = shipY - targetY;

    // find angle 
    double theta = Math.atan(  ( dY / dX ) );

    // find length of line ship centre - target centre
    double hypotemuse = dY / Math.sin(theta);

    // finally range between ship/target is:
    int range = (int) (hypotemuse - shipRadius - targetRadius);

    return range;

}

所以我的问题是,使用棕褐色和罪恶比找到平方根更有效吗?

我也许能够重构我的一些代码,以便从另一个方法(我必须解决它)获取θ值,这是否值得这样做?

还是有另一种方式?

请原谅我,如果我问的是显而易见的问题,或者犯了任何基本的错误,我已经很久没有用高中数学做任何事情了......

欢迎任何提示或建议!

编辑****

具体来说,我正在尝试在游戏中创建一个“扫描仪”设备,以检测敌人/障碍物何时接近/消失等。扫描仪将通过音频音或图形条或其他方式中继此信息。因此,虽然我不需要确切的数字,但理想情况下,我想知道:

  1. 目标比以前更接近/更远
  2. 目标A比目标B,C,D更接近/更远...
  3. 一个(希望是线性的?)比率,表示目标相对于0(碰撞)和最大范围(一些常数)离飞船的距离
  4. 有些目标会非常大(行星?),所以我需要考虑半径

我希望有一些聪明的优化/近似可能(dx + dy +(更长的dx,dy?),但是有了所有这些要求,也许不是......


答案 1

Math.hypot旨在获得更快,更准确的形式计算。所以这应该只是sqrt(x^2 + y^2)

return Math.hypot(x1 - x2, y1 - y2) - r1 - r2;

我无法想象任何比这更简单的代码,也没有比这更快的代码。


答案 2

如果你真的需要精确的距离,那么你就不能真正避免平方根。三角函数至少与平方根计算一样糟糕,如果不是更糟的话。

但是,如果您只需要近似距离,或者如果您只需要各种圆组合的相对距离,那么您肯定可以做一些事情。例如,如果只需要相对距离,请注意,平方数与其平方根具有相同的大于关系。如果您只是比较不同的对,请跳过平方根步骤,您将获得相同的答案。

如果您只需要近似距离,那么您可能会认为这大致等于较长的相邻边。这种近似值永远不会超过两倍。或者,您可以将查找表用于三角函数 - 这比任意平方根的查找表更实用。h


推荐