マウス座標に基づいて固定中心の周りの円軌道に沿ってノードを配置するにはどうすればよいですか (JavaFX)?
-
06-07-2019 - |
質問
基本的な JavaFX ゲーム開発を始めようとしていますが、円計算で混乱しています。
(x:250, y:250) に半径 50 の円があります。
私の目的は、マウスの位置に基づいて、上の円の円周上に配置される小さな円を作成することです。
私が混乱しているのは、座標空間とその背後にあるトリガーです。
私の問題は、画面上の X/Y 空間が 0,0 の中心にないという事実から生じています。ただし、画面の左上は 0,0、右下は 500,500 です。
私の計算は次のとおりです。
var xpos:Number = mouseEvent.getX();
var ypos:Number = mouseEvent.getY();
var center_pos_x:Number = 250;
var center_pos_y:Number = 250;
var length = ypos - center_pos_y;
var height = xpos - center_pos_x;
var angle_deg = Math.toDegrees(Math.atan(height / length));
var angle_rad = Math.toRadians(angle_deg);
var radius = 50;
moving_circ_xpos = (radius * Math.cos(angle_rad)) + center_pos_x;
moving_circ_ypos = (radius * Math.sin(angle_rad)) + center_pos_y;
マウスを動かしたときに計算した角度 (angle_deg) をアプリに出力させるようにしました。出力は以下のようになります。
マウスが反時計回りに移動している場合:
- 円の真上で中心と水平方向に並んでいる場合、角度は -0 です。
- 左側、垂直中央、角度は -90
- 円の真下で中心と水平方向に並んでいる場合、角度は 0 です。
- 右に垂直中央、角度は 90
では、0、90、180、270にするにはどうすればよいでしょうか??
きっと小さなことだとは思うのですが、それが何なのか全く思いつきません…
助けてくれてありがとう(そしていいえ、これは割り当てではありません)
解決
atan(height / length)
は角度を取得するには不十分です。各象限、および「ゼロ除算」の可能性を補正する必要があります。ほとんどのプログラミング言語ライブラリは、2つの引数を取る atan2
というメソッドを提供します。 y
および x
。このメソッドはこの計算を行います。
他のヒント
角度を計算せずに逃げることができます。代わりに、円の中心(250,250)とマウスの位置(xpos、ypos)を使用して線を定義します。線の長さが円の半径と等しい場合、線は円と交差します。
// Calculate distance from center to mouse. xlen = xpos - x_center_pos; ylen = ypos - y_center_pos; line_len = sqrt(xlen*xlen + ylen*ylen); // Pythagoras: x^2 + y^2 = distance^2 // Find the intersection with the circle. moving_circ_xpos = x_center_pos + (xlen * radius / line_len); moving_circ_ypos = y_center_pos + (ylen * radius / line_len);
マウスが円の中心にないことを確認するか、line_lenがゼロになり、マウスがブラックホールに吸い込まれます。
あります 「グラフィックスの宝石」という素晴らしい本 この種の問題の解決に役立ちます。これはアルゴリズムとソース コード (C 言語だと思います) のクックブックで、テスト済みの機能を使用して問題を迅速に解決できます。これを手に入れることを強くお勧めします。サーフェスの法線や衝突検出などのかなり複雑な操作を実行するコードをすぐに追加する必要があったときに、これにより時間を大幅に節約できました。