web-dev-qa-db-ja.com

ベクトル間の符号付き角度を見つける

ベクトルaからbへの符号付き角度thetaをどのように見つけますか?

そして、はい、シータ= arccos((a.b)/(| a || b |))であることを知っています。

ただし、これには記号が含まれていません(つまり、時計回りまたは反時計回りの回転を区別していません)。

Aからbに回転するための最小角度を教えてくれるものが必要です。正の符号は、+ x軸から+ y軸への回転を示します。逆に、負の符号は+ x軸から-y軸への回転を示します。

assert angle((1,0),(0,1)) == pi/2.
assert angle((0,1),(1,0)) == -pi/2.
29
Cerin

選択した数学ライブラリにatan2()関数がある場合:

signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x)
33
Sparr

使用したいものは、「perp内積」と呼ばれることがよくあります。つまり、ベクトルの1つに垂直なベクトルを見つけてから、他のベクトルとの内積を見つけます。

if(a.x*b.y - a.y*b.x < 0)
    angle = -angle;

これを行うこともできます:

angle = atan2( a.x*b.y - a.y*b.x, a.x*b.x + a.y*b.y );
52
Derek Ledbetter