マウス座標に基づいて固定中心の周りの円軌道に沿ってノードを配置するにはどうすればよいですか (JavaFX)?

StackOverflow https://stackoverflow.com/questions/267613

質問

基本的な 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 。このメソッドはこの計算を行います。

Wikipedia:atan2

の詳細

他のヒント

角度を計算せずに逃げることができます。代わりに、円の中心(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 言語だと思います) のクックブックで、テスト済みの機能を使用して問題を迅速に解決できます。これを手に入れることを強くお勧めします。サーフェスの法線や衝突検出などのかなり複雑な操作を実行するコードをすぐに追加する必要があったときに、これにより時間を大幅に節約できました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top