在java中查找两个圆圈之间距离的最有效方法?
因此,显然计算平方根不是很有效,这让我想知道找出两个圆之间的距离(我在下面称之为范围)的最佳方法是什么?
所以通常我会计算:
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;
}
所以我的问题是,使用棕褐色和罪恶比找到平方根更有效吗?
我也许能够重构我的一些代码,以便从另一个方法(我必须解决它)获取θ值,这是否值得这样做?
还是有另一种方式?
请原谅我,如果我问的是显而易见的问题,或者犯了任何基本的错误,我已经很久没有用高中数学做任何事情了......
欢迎任何提示或建议!
编辑****
具体来说,我正在尝试在游戏中创建一个“扫描仪”设备,以检测敌人/障碍物何时接近/消失等。扫描仪将通过音频音或图形条或其他方式中继此信息。因此,虽然我不需要确切的数字,但理想情况下,我想知道:
- 目标比以前更接近/更远
- 目标A比目标B,C,D更接近/更远...
- 一个(希望是线性的?)比率,表示目标相对于0(碰撞)和最大范围(一些常数)离飞船的距离
- 有些目标会非常大(行星?),所以我需要考虑半径
我希望有一些聪明的优化/近似可能(dx + dy +(更长的dx,dy?),但是有了所有这些要求,也许不是......