C ++でのatanとatan2の違いは何ですか?


回答:



321

学校の数学から、接線には定義があることがわかります

tan(α) = sin(α) / cos(α)

また、関数に提供する角度に基づいて4つの象限を区別します。の符号sincosおよび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)関数は、実際にかかるyx長さを持つベクトルの投影である引数、v角度αy軸及びx軸上、すなわち

y = v * sin(α)
x = v * cos(α)

それは関係を与える

y/x = tan(α)

結論: atan(y/x)一部の情報は差し控えられ、入力が象限IまたはIVからのものであるとしか想定できません。対照的に、atan2(y,x)すべてのデータを取得するため、正しい角度を解決できます。


3
細かい-π/2 <= atan() <= π/2点が1つありますが、範囲には実際にはpi/2第2象限の1点()が含まれています。
Zボソン2015

28

もう1つ言及する必要があるのatan2は、のような式を使用して接線を計算する場合、より安定してatan(y / x)おり、x0または0に近いことです。


興味深いのですが、これに関する情報源はありますか?これは一般に当てはまりますか、それともC ++だけですか?
ジェラール

26

実際の値はラジアンですが、度で解釈するには次のようになります。

  • atan = -90と90の間の角度値を与える
  • atan2 = -180と180の間の角度値を与える

ナビゲーションでの方位や方位などのさまざまな角度の計算を含む私の仕事ではatan2、ほとんどの場合、仕事をします。


12

atan(x)xの逆正接の主値をラジアンで返します。

atan2(y、x)ラジアンで表されたy / xの逆正接の主値を返します。

符号のあいまいさのために、関数は、どの象限がタンジェント値(atanのみ)によってのみ低下するかを確実に決定できないことに注意してください。象限を決定する必要がある場合は、atan2を使用できます。


3
atan2(x、y)-> atan2(y、x)
yesraaj 2008年

主値の範囲はですが(-pi,pi]、atan2には範囲がある[-pi,pi]ため-piatan2(-0.0,x)forのために別のブランチからの1つの追加の値が含まれx<0ます。
Zボソン2015

4

主な質問は、「どちらを使用すべきか」、「どちらを使用すべきか」、「正しいものを使用していますか」を理解しようとしていると思います。

重要な点は、tanは時間距離ベクトルの場合のように右上方向の曲線で正の値を供給することだけを目的としたものであると思います。Ceroは常に左下にあり、Thigは上下にしか移動できず、速度が遅くなったり速くなったりします。atanは負の数を返さないので、結果を加算または減算するだけでは、画面上の4方向に物事を追跡できません。

atan2は原点が真ん中にあることを意図しており、物事は後方または下方に移動できます。これは画面表示で使用する方法です。カーブをどの方向に移動するかが重要であるためです。したがって、atan2は負の数を与える可能性があります。これは、そのセロが中央にあり、その結果が4方向に物事を追跡するために使用できるものだからです。



2

直角三角形を考えます。斜辺r、水平辺y、垂直辺xにラベルを付けます。対象の角度αは、xとrの間の角度です。

C ++ atan2(y, x)は、角度αの値をラジアンで示します。 atanyとxを個別に知るのではなく、y / xにのみ関心がある場合に使用します。したがって、p = y / xの場合、αを取得するにはを使用しますatan(p)

を使用atan2して象限を決定することはできません。どの象限を知っているatan2場合にのみ使用できます。特に、正のxとyは最初の象限を意味し、正のyと負のxは2番目の象限を意味します。またはそれ自体が単に正または負の数を返すだけです。atanatan2


4
あなたが持っているすべてがp=y/xあなたがまだ使うことができるならばatan2(p,1)
Mark Ransom 2012年

0

以下のMehrwolfは正しいですが、ここに役立つヒューリスティックがあります。

2次元座標系で作業している場合は、逆タンジェントをプログラミングする場合によくあることですが、atan2を必ず使用してください。2 piの完全な角度範囲を提供し、x座標のゼロを処理します。

別の言い方をすると、atan(y / x)は事実上常に間違っているということです。引数をy / xと見なせない場合にのみatanを使用してください。


0

atan2(y,x)通常、デカルト座標を極座標に変換する場合に使用されます。それはあなたに角度を与えるでしょう、sqrt(x*x+y*y)または、可能であれば、hypot(y,x)あなたにサイズを与えます。

atan(x)単にtanの逆です。atan(y/x)システムがを提供していないために使用する必要のある厄介なケースでは、正しい角度を取得するために、およびのatan2兆候とxをさらにチェックする必要があります。yx=0

注: atan2(y,x)は、両方の引数がゼロの場合を除いて、yおよびのすべての実数値に対して定義されxます。


0

:ATAN2では、出力され-pi、< atan2(y,x)< pi
とATANで、出力は次のようになります。-pi/2< atan(y/x)< pi/2 //それは四半期を考慮していませ用量。
あなたが間の向きを取得したい場合02*pi(高校数学など)を、我々はATAN2を使用する必要があり、負の値は、追加のため2*piの間で最終的な結果を得るために02*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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.