【发布时间】:2012-05-19 14:38:02
【问题描述】:
显然计算平方根不是很有效,这让我想知道找出两个圆之间的距离(我在下面称为范围)的最佳方法是什么?
所以通常我会锻炼:
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(θ)
最后算出范围 范围 + 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;
}
所以我的问题是,使用 tan 和 sin 是否比求平方根更有效?
我也许可以重构我的一些代码以从另一种方法(我必须解决它)中获取 theta 值,这样做是否值得?
或者还有其他方法吗?
如果我问的很明显,或者犯了任何基本错误,请原谅,我已经很久没有用高中数学做任何事情了......
欢迎任何提示或建议!
****编辑****
具体来说,我正在尝试在游戏中创建一个“扫描仪”设备,以检测敌人/障碍物何时接近/消失等。扫描仪将通过音频或图形栏或其他东西传递此信息。因此,虽然我不需要确切的数字,但理想情况下我想知道:
- 目标比以前更近/更远了
- 目标 A 比目标 B、C、D...更近/更远...
- 一个(希望是线性的?)比率,表示目标与船舶的距离相对于 0(碰撞)和最大范围(某个常数)
- 有些目标会非常大(行星?),所以我需要考虑半径
我希望可以进行一些巧妙的优化/近似(dx + dy +(dx,dy 的更长?),但考虑到所有这些要求,可能不会......
【问题讨论】:
-
我被你的斜边逗乐了!
-
不要使用
toDegrees:Math.sin使用弧度(就像数学中的所有三角函数一样) -
您是否使用
sqrt分析过您的代码? -
@BrunoKim :D 这也不是我第一次这样拼写...我想我更喜欢我的版本,灵感来自我最喜欢的动物,hypotomus,我的意思是河马... hippyhoppytoppamossymus...嗯。我可能有轻度阅读障碍。
-
@bizso09 我不确定'profiled'是什么意思,但我猜'test for speed'?如果是这样,下面的 Ankit 似乎已经做到了。我想在确定性能存在问题之前,我会遵循不要过分担心的建议。
标签: java performance math trigonometry