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

kim*_*man 15 java math performance trigonometry

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

查找两个圆圈之间的范围

通常我会解决:

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
Run Code Online (Sandbox Code Playgroud)

当你查找"range"为0时的情况时,试图避免平方根工作正常:

 if ( (r1 + r2 + 0 )^2 > (dy^2 + dx^2) )
Run Code Online (Sandbox Code Playgroud)

但是,如果我试图计算出距离范围,我最终会得到一些笨拙的等式:

 range(range + 2r1 + 2r2) = dy^2 + dx^2 - (r1^2 + r2^2 + 2r1r2)
Run Code Online (Sandbox Code Playgroud)

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

显而易见的答案是trignometry并首先找到theta:

  Tan(theta) = dy/dx
  theta = dy/dx * Tan^-1
Run Code Online (Sandbox Code Playgroud)

然后找到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;

}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,使用tan和sin比找到平方根更有效吗?

我可能能够重构我的一些代码来从另一个方法(我必须解决它)得到theta值这是值得做的吗?

或者还有另一种方式吗?

请原谅我,如果我问的是显而易见的,或者犯了任何基本的错误,我用了很多高中数学做了很长时间......

任何提示或建议欢迎!

****编辑****

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

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

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

Lou*_*man 12

Math.hypot旨在更快,更准确地计算表格sqrt(x^2 + y^2).所以这应该是公正的

return Math.hypot(x1 - x2, y1 - y2) - r1 - r2;
Run Code Online (Sandbox Code Playgroud)

我无法想象任何比这更简单的代码,也不会更快.


Ern*_*ill 9

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

但是如果你只需要近似的距离,或者你只需​​要相对距离来进行各种圆圈组合,那么你肯定可以做些什么.例如,如果您只需要相对距离,请注意平方数与平方根的关系大于关系.如果您只是比较不同的对,跳过平方根步骤,您将得到相同的答案.

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