문제

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

도움이 되었습니까?

해결책

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(α) 긍정적, 우리는 각도가 첫 번째 또는 3 차 사분면에서 왔는지 여부를 구별 할 수 없으며, 음수이라면 두 번째 또는 네 번째 사분면에서 나올 수 있습니다. 그래서 컨벤션에 의해 atan() 첫 번째 또는 네 번째 사분면에서 각도를 반환합니다 (예 : -π/2 <= atan() <= π/2), 탄젠트에 대한 원래 입력에 관계없이.

전체 정보를 되 찾으려면 부서의 결과를 사용해서는 안됩니다. sin(α) / cos(α) 그러나 우리는 사인과 코사인의 값을 별도로 봐야합니다. 그리고 이것이 무엇입니다 atan2() 하다. 둘 다 필요합니다 sin(α) 그리고 cos(α) 추가하여 4 개의 사분면을 모두 해결합니다 π 결과에 atan() 코사인이 음수 일 때마다.

주목: 그만큼 atan2(y, x) 기능은 실제로 a를 취합니다 y 그리고 a x 인수, 길이가있는 벡터의 투영 v 그리고 각도 α y- 및 x 축에서, 즉

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

관계를 제공합니다

y/x = tan(α)

결론: atan(y/x) 일부 정보를 보류하고 입력이 사분면 I 또는 IV에서 나온다고 가정 할 수 있습니다. 대조적으로, atan2(y,x) 모든 데이터를 가져 와서 올바른 각도를 해결할 수 있습니다.

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

실제 값은 라디안에 있지만, 그것들을 각도로 해석하는 것은 다음과 같습니다.

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

내비게이션의 제목 및 베어링과 같은 다양한 각도의 계산과 관련된 저의 작업의 경우 atan2 대부분의 경우 작업을 수행합니다.

Atan (x)은 라디안으로 표현 된 x의 아크 탄젠트의 주요 값을 반환합니다.

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

부호 모호성으로 인해, 함수는 사분면이 탄젠트 값 (Atan 단독)에 의해서만 떨어지는 확실성으로 결정할 수 없습니다. 사분면을 결정 해야하는 경우 ATAN2를 사용할 수 있습니다.

주요 질문은 "언제 또는 다른 사람을 사용해야하는지"또는 "내가 사용해야한다"또는 "올바른 것을 사용하고 있습니까"?

중요한 점은 Atan만이 시간 거리 벡터와 같은 오른쪽 상승 방향 곡선에서 양수 값을 공급하기위한 것 같아요. Cero는 항상 왼쪽 하단에 있으며 Thigs는 오른쪽으로 올라갈 수 있습니다. Atan은 음수를 반환하지 않으므로 결과를 추가/빼기 만하면 화면의 4 방향으로 추적 할 수 없습니다.

ATAN2는 원점이 중간에있는 것이며, 상황은 뒤로 또는 아래로 이동할 수 있습니다. 그것은 곡선이 어떤 방향으로 가고 싶은지 중요하기 때문에 화면 표현에서 사용하는 것입니다. 따라서 ATAN2는 Cero가 중심에 있기 때문에 음수를 줄 수 있으며 결과는 4 방향으로 물건을 추적하는 데 사용할 수있는 것입니다.

ATAN2를 사용하면 언급 된대로 사분면을 결정할 수 있습니다 여기.

사분면을 결정 해야하는 경우 ATAN2를 사용할 수 있습니다.

직각 삼각형을 고려하십시오. 우리는 hypotenuse r, 수평 측 Y 및 수직 측면 x를 라벨을 붙입니다. 관심 각도 @는 x와 r 사이의 각도입니다.

C ++ atan2 (y, x)는 우리에게 라디안에서 각도 @의 값을 제공합니다. Atan은 우리가 Y/X가 Y 및 X가 개별적으로 알고 있거나 관심이있는 경우 사용됩니다. 따라서 p = y/x라면 @를 얻으려면 atan (p)을 사용합니다.

ATAN2를 사용할 수 없습니다. 사분면을 결정할 수 있습니다. ATAN2 만 사용할 수 있습니다. 이미 알고 있습니다 당신의 사분면! 특히 양의 x와 y는 제 1 사분면, 양의 y 및 네거티브 x, 두 번째 및 on을 암시합니다. Atan 또는 Atan2 자체는 단순히 양수 또는 음수를 반환합니다.

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

2 차원 좌표계에서 작업하는 경우 종종 역 탄젠트를 프로그래밍하는 경우가 종종 Atan2를 사용해야합니다. 그것은 전체 2 pi 각도를 제공하고 x 좌표에서 0을 돌볼 것입니다.

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

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

atan(x) 단순히 황갈색의 역수입니다. 성가신 경우에는 사용해야합니다 atan(y/x) 시스템이 제공하지 않기 때문입니다 atan2, 당신은 x 그리고 y, 그리고 x=0, 올바른 각도를 얻기 위해.

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

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top