したがって、平方根の計算はあまり効率的ではないようです。そのため、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)
どこにも行きません。少なくともここからの範囲でそれを解決する方法がわかりません...
明白な答えは三角法であり、最初にシータを見つけます。
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?)が、これらすべての要件では、おそらくそうではありません...