문제
차이점은 무엇입니까? 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