オブジェクトがJavaで指定された最大速度でマウスポインタをたどる簡単なアルゴリズムがあります。アルゴリズムの核心はこれです:
// Set up displacement trackers for later.
// (These are used in another part of the algorithm, which rotates
// the object to face along its path tangent with a moving average.)
double dx = 0, dy = 0;
// ... more code
// Find the angle of travel.
double angle = Math.atan2(m.y - target.getY(), m.x - target.getX());
// Set displacements with polar coordinate transforms.
dx = maxSpeed * Math.cos(angle);
dy = maxSpeed * Math.sin(angle);
// Now go there.
target.setX((int) Math.round(target.getX() + dx));
target.setY((int) Math.round(target.getY() + dy));
これは毎秒30フレームで実行されています。パフォーマンスは問題ではありません。
コードは中規模から大規模の値maxSpeed
(5以上で問題ありません)で正常に実行されますが、実際に低い値では、コードによってオブジェクトが特定の角度でのみ移動します。たとえば、maxSpeed = 1
では、ターゲットは45°の角度でしか移動できません。
問題を理解する方法は次のとおりです。
maxSpeed
等しくしましょう1
。したがって、Math.sin
とMath.cos
は常に[-1、1]の範囲の値を返し、また[-1、1]の範囲dy
にdx
なります。丸めによって整数に変換する場合(ターゲットのx位置とy位置がint
変数として定義されているため)、変位はそれぞれ、、、またはのいずれか-1
に丸められ、可能な移動を同じ8つの角度に効果的に制限します。0
1
したがって、たとえば、オブジェクトが(0、0)で始まり、マウスを(300、100)に置くと、オブジェクトは最初に完全に水平に移動し、次に-45°の角度で移動します。オブジェクトを(ほぼ)一定の角度で、原点から終点まで(ほぼ)直線で移動させたいのですが。
double
基になるx座標とy座標を値に変換する以外に、これを行うための最良の方法は何でしょうか。