明らかに平方根を計算するのはあまり効率的ではありません。それで、2つの円の間の距離(以下で範囲と呼ぶ)を見つけるのが最善の方法は何ですか?javaの2つの円の間の距離を見つける最も効率的な方法は?
ので、通常私は仕事になります。
: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)
これはどこにもありません。少なくとも私は明白な答えは、その後trignometryと最初のFindシータある
...ここから範囲のためにそれを解決する方法がわからない:
Tan(theta) = dy/dx
theta = dy/dx * Tan^-1
その後hypotemuse 罪(シータ)を見つけます= DY/H H = DY/SIN(シータ)
最後範囲 範囲+ R1 + R2 = DY/SIN(シータ) 範囲= DY/SIN(シータ)うまく - 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;
}
:?私がやったとこのようになります方法を持っているものです時
私のコードのいくつかをリファクタリングして、別の方法(私はそれを解決する必要があります)からテータ値を得ることができますか?
また別の方法がありますか?
私は
任意のヒントやアドバイスを歓迎...私が何かをする高校の数学を使用していたので、長い時間がかかった、明白なことを尋ねる、または任意の基本ミスをしてるなら、私を許しなさい!
**** **** EDIT
具体的に私はなど遠ざかる/敵/障害物が接近している時に検出し、ゲームに「スキャナ」のデバイスを作成しようとしているスキャナがこれを中継しますオーディオトーンまたはグラフィックバーまたは何かを介して情報を送信する。私は正確な数を必要としないためものの、理想的には私が知っていると思います:
- ターゲットは/近いさらにより
- ターゲットAは近いの前に/さらにターゲットB、C、D ... より
- 0(衝突)と最大範囲(ある定数)に対してターゲットからどれくらい離れているかを表すA(線形のうまくいけば?)の比率
- いくつかのターゲットは非常に大きいでしょう)私は半径を考慮に入れる必要があります
私はいくつかの賢明な最適化/近似が可能です(dx + dy +(長いdx、dy?あなたは本当に、あなたが本当に平方根を避けることができない、正確な距離を必要とする...
私はあなたの斜辺で遊んでいます! –
'toDegrees'を使用しません:' Math.sin'はラジアンを使用します(Mathのすべてのtrig関数を実行します) –
'sqrt'でコードをプロファイリングしましたか? – siamii