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