web-dev-qa-db-ja.com

2点間の角度を取得するための数学計算?

重複の可能性:
横軸に対する2点間の角度の計算方法は?

私は何年もの間これを探していました、そしてそれは本当に私を苛立たせているので、私はただ尋ねることに決めました...

2つの点(つまり、x1、y1、およびx2、y2)がある場合、y1 == y2およびx1> x2の場合、角度は180度であると仮定して、これら2つの点の間の角度を計算します。

私は(高校の知識を使用して)使用している以下のコードを持っていますが、希望する結果が得られないようです。

float xDiff = x1 - x2;
float yDiff = y1 - y2;
return (float)Math.Atan2(yDiff, xDiff) * (float)(180 / Math.PI);

事前のおかげで、私はとてもイライラしています...

10

私が集めたものから、あなたは以下を保持したいと思います:

  • 水平線:P1 -------- P2 => 0°
  • 水平線:P2 -------- P1 => 180°

水平線を時計回りに回転させる

あなたは、角度を時計回りに大きくしたいと言いました。

P1 -------- P2P1より上になるようにこの線をP2回転させると、角度は90°でなければなりません。

ただし、反対方向に回転した場合、P1P2の下になり、角度は-90°または270°になります。

atan2での作業

基礎P1を原点と見なし、原点に対するP2の角度を測定すると、P1 -------- P2は正しく0を生成します。

float xDiff = x2 - x1;
float yDiff = y2 - y1;
return Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI;

ただし、atan2CCW方向の角度を大きくしてみましょう。原点を中心にCCW方向に回転すると、yは次の値を通過します。

  • y = 0
  • y> 0
  • y = 0
  • y <0
  • y = 0

これは、yの符号を単純に反転して方向を反転できることを意味します。ただし、C#の座標は上から下に増加するため、yDiffを計算するときに符号はすでに逆になっています。

21
phant0m