C ++에서 atan과 atan2의 차이점은 무엇입니까?


157

C ++ atanatan2C ++ 의 차이점은 무엇입니까 ?

답변:



322

학교 수학에서 접선에 정의가 있음을 알고 있습니다

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(α)cos(α)및 추가로 네 개의 사분면을 해결 π의 결과 atan()코사인이 부정 될 때마다.

참고 :atan2(y, x)함수는 실제로 a yx인수를 사용합니다. 이는 y 축 및 x 축에 길이 v와 각도 가있는 벡터의 투영입니다.α

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

관계를 제공합니다

y/x = tan(α)

결론 : atan(y/x) 일부 정보가 보류되며 입력이 사분면 I 또는 IV에서 온 것으로 가정 할 수 있습니다. 반대로 atan2(y,x)모든 데이터를 가져 오므로 올바른 각도를 확인할 수 있습니다.


3
하나의 작은 세부 사항, 범위는 -π/2 <= atan() <= π/2실제로 pi/2사분면 II의 한 점 ( )을 포함 합니다.
Z boson

28

언급하는 또 다른 점은이 atan2같은 표현을 사용하여 접선을 계산할 때 더 안정 atan(y / x)x0 또는 0에 가까운 것입니다.


흥미 롭습니다, 이것에 대한 소스가 있습니까? 이것은 일반적으로 또는 C ++에만 해당됩니까?
Gerard

26

실제 값은 라디안 단위이지만 값을도 단위로 해석하면 다음과 같습니다.

  • atan =는 -90에서 90 사이의 각도 값을 제공합니다
  • atan2 =는 -180에서 180 사이의 각도 값을 제공합니다

내비게이션의 방향 및 방위와 같은 다양한 각도의 계산과 관련된 내 작업의 atan2경우 대부분의 경우 작업이 수행됩니다.


12

atan (x) x의 아크 탄젠트의 주요 값을 라디안으로 표시합니다.

atan2 (y, x) y / x의 아크 탄젠트의 주요 값을 라디안으로 표시합니다.

부호 모호성으로 인해, 함수는 각도가 접선 값 (아탄 단독)만큼만 떨어지는 사분면을 확실하게 결정할 수 없습니다. 사분면을 결정해야하는 경우 atan2를 사용할 수 있습니다.


3
atan2 (x, y)-> atan2 (y, x)
yesraaj

원칙 값의 범위는 (-pi,pi]있지만 atan2에는 범위가 [-pi,pi]있으므로 for -pi로 인해 다른 분기의 추가 값 하나가 포함됩니다 . atan2(-0.0,x)x<0
Z boson

4

주된 질문은 "하나를 사용해야 할 때", "어떻게 사용해야합니까"또는 "올바른 것을 사용해야합니까?"

중요한 점은 atan만이 시거리 벡터와 같이 오른쪽 방향 곡선으로 양수 값을 공급하기위한 것입니다. Cero는 항상 왼쪽 하단에 있으며 티그는 느리거나 빠르게 올라갈 수 있습니다. atan은 음수를 반환하지 않으므로 결과를 더하거나 빼는 것만으로도 화면에서 4 가지 방향으로 사물을 추적 할 수 없습니다.

atan2는 원점이 중간에 있도록하기위한 것이며 사물이 뒤로 또는 아래로 갈 수 있습니다. 화면 표시에 사용하는 것이 곡선의 방향에 관계가 있기 때문입니다. 따라서 atan2는 cero가 중앙에 있기 때문에 음수를 줄 수 있으며 결과는 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, 두 번째 등을 의미합니다. atan또는 atan2단순히 양수 또는 음수를 반환합니다.


4
당신이 가진 전부 p=y/x는 여전히 사용할 수 있습니다 atan2(p,1).
마크 랜섬

0

아래의 Mehrwolf는 정확하지만 여기에 도움이 될 휴리스틱이 있습니다.

역 탄젠트를 프로그래밍하는 경우 인 2 차원 좌표계에서 작업하는 경우 반드시 atan2를 사용해야합니다. 전체 2pi 범위의 각도를 제공하고 x 좌표에서 0을 처리합니다.

이것을 말하는 또 다른 방법은 atan (y / x)가 사실상 항상 잘못이라는 것입니다. 인수를 y / x로 생각할 수없는 경우에만 atan을 사용하십시오.


0

atan2(y,x)직교 좌표를 극좌표로 변환하려는 경우 일반적으로 사용됩니다. 그것은 당신에게 각도를 줄 것입니다, sqrt(x*x+y*y)또는 가능한 경우, hypot(y,x)당신에게 크기를 줄 것입니다.

atan(x)단순히 황갈색의 역수입니다. 당신이 사용할 필요가 귀찮은 경우 atan(y/x)시스템이 제공하지 않기 때문에 atan2, 당신의 징후에 대한 추가 검사 수행해야 x하고 y, 그리고 대한을 x=0정확한 각도를 얻기 위해.

참고 : 두 인수가 모두 0 인 경우를 제외하고 및의 atan2(y,x)모든 실제 값에 대해 정의 됩니다.yx


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.