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值这是值得做的吗?
或者还有另一种方式吗?
请原谅我,如果我问的是显而易见的,或者犯了任何基本的错误,我用了很多高中数学做了很长时间......
任何提示或建议欢迎!
****编辑****
具体来说,我正在尝试在游戏中创建一个"扫描仪"设备,以检测敌人/障碍物何时接近/离开等.扫描仪将通过音频音调或图形条等传递此信息.因此,虽然我不需要确切的数字,但理想情况下我想知道:
我希望有一些聪明的优化/近似可能(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)
我无法想象任何比这更简单的代码,也不会更快.
如果你真的需要准确的距离,那么你就无法真正避开平方根.三角函数至少与平方根计算一样糟糕,如果不是更糟的话.
但是如果你只需要近似的距离,或者你只需要相对距离来进行各种圆圈组合,那么你肯定可以做些什么.例如,如果您只需要相对距离,请注意平方数与平方根的关系大于关系.如果您只是比较不同的对,跳过平方根步骤,您将得到相同的答案.
如果您只需要近似距离,那么您可能会认为这h大致等于较长的相邻边.这种近似值永远不会超过两倍.或者您可以使用查找表来进行三角函数 - 这比任意平方根的查找表更实用.