回答:
std::atan2
4つの象限すべてのアークタンジェントを計算できます。std::atan
象限1と4からのみ計算できます。
学校の数学から、接線には定義があることがわかります
tan(α) = sin(α) / cos(α)
また、関数に提供する角度に基づいて4つの象限を区別します。の符号sin
、cos
およびtan
次の関係(ここでは、の正確な倍数を無視しますπ/2
):
Quadrant Angle sin cos tan
-------------------------------------------------
I 0 < α < π/2 + + +
II π/2 < α < π + - -
III π < α < 3π/2 - - +
IV 3π/2 < α < 2π - + -
の値tan(α)
が正の場合、角度が第1象限か第3象限かを区別できず、負の場合、角度は第2象限または第4象限から来る可能性があります。したがって、慣例により、接線への元の入力に関係なくatan()
、第1または第4象限(つまり-π/2 <= atan() <= π/2
)からの角度を返します。
完全な情報を取得するために、除算の結果を使用する必要はありませんsin(α) / cos(α)
が、正弦と余弦の値を個別に調べる必要があります。そして、これが何をするかatan2()
です。sin(α)
and cos(α)
との両方を使用し、コサインが負のπ
場合はatan()
常に結果に追加することにより、4つの象限すべてを解決します。
備考:atan2(y, x)
関数は、実際にかかるy
とx
長さを持つベクトルの投影である引数、v
角度α
y軸及びx軸上、すなわち
y = v * sin(α)
x = v * cos(α)
それは関係を与える
y/x = tan(α)
結論:
atan(y/x)
一部の情報は差し控えられ、入力が象限IまたはIVからのものであるとしか想定できません。対照的に、atan2(y,x)
すべてのデータを取得するため、正しい角度を解決できます。
atan(x)xの逆正接の主値をラジアンで返します。
atan2(y、x)ラジアンで表されたy / xの逆正接の主値を返します。
符号のあいまいさのために、関数は、どの象限がタンジェント値(atanのみ)によってのみ低下するかを確実に決定できないことに注意してください。象限を決定する必要がある場合は、atan2を使用できます。
(-pi,pi]
、atan2には範囲がある[-pi,pi]
ため-pi
、atan2(-0.0,x)
forのために別のブランチからの1つの追加の値が含まれx<0
ます。
主な質問は、「どちらを使用すべきか」、「どちらを使用すべきか」、「正しいものを使用していますか」を理解しようとしていると思います。
重要な点は、tanは時間距離ベクトルの場合のように右上方向の曲線で正の値を供給することだけを目的としたものであると思います。Ceroは常に左下にあり、Thigは上下にしか移動できず、速度が遅くなったり速くなったりします。atanは負の数を返さないので、結果を加算または減算するだけでは、画面上の4方向に物事を追跡できません。
atan2は原点が真ん中にあることを意図しており、物事は後方または下方に移動できます。これは画面表示で使用する方法です。カーブをどの方向に移動するかが重要であるためです。したがって、atan2は負の数を与える可能性があります。これは、そのセロが中央にあり、その結果が4方向に物事を追跡するために使用できるものだからです。
直角三角形を考えます。斜辺r、水平辺y、垂直辺xにラベルを付けます。対象の角度αは、xとrの間の角度です。
C ++ atan2(y, x)
は、角度αの値をラジアンで示します。
atan
yとxを個別に知るのではなく、y / xにのみ関心がある場合に使用します。したがって、p = y / xの場合、αを取得するにはを使用しますatan(p)
。
を使用atan2
して象限を決定することはできません。どの象限を知っているatan2
場合にのみ使用できます。特に、正のxとyは最初の象限を意味し、正のyと負のxは2番目の象限を意味します。またはそれ自体が単に正または負の数を返すだけです。atan
atan2
p=y/x
あなたがまだ使うことができるならばatan2(p,1)
。
atan2(y,x)
通常、デカルト座標を極座標に変換する場合に使用されます。それはあなたに角度を与えるでしょう、sqrt(x*x+y*y)
または、可能であれば、hypot(y,x)
あなたにサイズを与えます。
atan(x)
単にtanの逆です。atan(y/x)
システムがを提供していないために使用する必要のある厄介なケースでは、正しい角度を取得するために、およびのatan2
兆候とx
をさらにチェックする必要があります。y
x=0
注: atan2(y,x)
は、両方の引数がゼロの場合を除いて、y
およびのすべての実数値に対して定義されx
ます。
:ATAN2では、出力され-pi
、< atan2(y,x)
< pi
とATANで、出力は次のようになります。-pi/2
< atan(y/x)
< pi/2
//それは四半期を考慮していませ用量。
あなたが間の向きを取得したい場合0
や2*pi
(高校数学など)を、我々はATAN2を使用する必要があり、負の値は、追加のため2*pi
の間で最終的な結果を得るために0
と2*pi
。
これを明確に説明するJavaソースコードを次に示します。
System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter
System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter
System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter
System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4
-π/2 <= atan() <= π/2
点が1つありますが、範囲には実際にはpi/2
第2象限の1点()が含まれています。