개발/C++

[C++] tan과 tan2의 차이점은 무엇입니까?

MinorMan 2022. 10. 14. 12:42
반응형

<질문>

차이점은 무엇입니까atan 그리고atan2 C++에서?


<답변1>

학교 수학에서 우리는 탄젠트에 정의가 있다는 것을 압니다.

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() 첫 번째 또는 네 번째 사분면에서 각도를 반환합니다(즉,-π/2 <= atan() <= π/2), 접선에 대한 원래 입력에 관계없이.

전체 정보를 되찾기 위해 나눗셈의 결과를 사용해서는 안 됩니다.sin(α) / cos(α) 그러나 사인과 코사인 값을 별도로 살펴봐야 합니다. 그리고 이것이 바로atan2() 하다. 둘 다 걸리고,sin(α) 그리고cos(α) 다음을 추가하여 4개의 사분면을 모두 해결합니다.π 의 결과로atan() 코사인이 음수일 때.

참고: 그만큼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) 모든 데이터를 가져 와서 올바른 각도를 해결할 수 있습니다.


<답변2>

std::atan2 4개의 사분면 모두의 아크탄젠트를 계산할 수 있습니다.std::atan 사분면 1과 4에서만 계산할 수 있습니다.


<답변3>

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

  • atan = -90에서 90 사이의 각도 값 제공
  • atan2 = -180에서 180 사이의 각도 값 제공

항법에서 방향과 방위와 같은 다양한 각도의 계산을 포함하는 나의 작업을 위해,atan2 대부분의 경우 작업을 수행합니다.


<답변4>

또 언급할 사항은atan2 다음과 같은 표현식을 사용하여 탄젠트를 계산할 때 더 안정적입니다.atan(y / x) 그리고x 0 또는 0에 가깝습니다.


<답변5>

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

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

부호가 모호하기 때문에 함수는 각도가 해당 탄젠트 값(atan 단독)에 의해서만 해당하는 사분면을 확실히 결정할 수 없습니다. 사분면을 결정해야 하는 경우 atan2를 사용할 수 있습니다.


<답변6>

주요 질문은 "언제 하나 또는 다른 것을 사용해야 하는지", 또는 "어느 것을 사용해야 하는지", 또는 "올바른 것을 사용하고 있습니까?"를 파악하려고 하는 것 같습니다.

중요한 점은 tan이 시간-거리 벡터와 같이 오른쪽 위 방향 곡선에서 양수 값을 공급하기 위한 것뿐이라는 것입니다. 0은 항상 왼쪽 하단에 있으며, thig는 위쪽과 오른쪽으로만 이동할 수 있습니다. 더 느리거나 빠를 뿐입니다. atan은 음수를 반환하지 않으므로 결과를 더하거나 빼는 것만으로는 화면의 4방향을 추적할 수 없습니다.

atan2는 원점이 중앙에 있도록 의도되었으며 상황이 뒤로 또는 아래로 갈 수 있습니다. 커브를 원하는 방향이 중요하기 때문에 화면 표현에 사용하는 것입니다. 따라서 atan2는 음수를 줄 수 있습니다. 0이 중앙에 있고 그 결과가 4방향으로 사물을 추적하는 데 사용할 수 있기 때문입니다.


<답변7>

직각 삼각형을 고려하십시오. 빗변 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는 두 번째 사분면을 의미합니다.atan 또는atan2 자신은 단순히 양수 또는 음수를 반환합니다. 그 이상은 아닙니다.


<답변8>

tan2를 사용하면 명시된 대로 사분면을 결정할 수 있습니다.here.

필요한 경우 tan2를 사용할 수 있습니다. 사분면을 결정하십시오.


<답변9>

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

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

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


<답변10>

atan2에서 출력은 다음과 같습니다.-pi <atan2(y,x) <pi
atan에서 출력은 다음과 같습니다. -pi/2 < atan(y/x) < pi/2 //분기를 고려하지 않습니다.
02*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

<답변11>

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, 두 인수가 모두 0인 경우를 제외하고.

반응형