2006년 4월 1일 토요일

Atan2 - Arc tangent

atan2(y, x);
좌표상 원점(0, 0)을 기준으로 (x, y)가 x축가 이루는 각 theta를 구해준다.
x-y coordinate를 polar coordinate로 바꿀 때나 원을 그릴 때 사용한다.

. atan(x) 대신 atan2(y, x)를 쓰는 이유
x가 0일 때 분모가 0이 되므로 atan(x)로는 모든 각을 계산할 수가 없다.

(x, y)
. 1사분면일때 : 0 ~ Pi/2 (0 ~ 1.5708)
. 2사분면일때 : Pi/2 ~ Pi (0 ~ 3.14159)
. 3사분면일때 : -Pi ~ -Pi/2 (-3.14159 ~ -1.5708)
. 4사분면일때 : -Pi/2 ~ 0 (-1.5708 ~ 0)
. (x, y)가 원점을 기준으로 반시계방향으로 돌 때
atan2(y, x)의 값은 2사분면에서 3사분면으로 넘어가는 순간 -2Pi가 되고
나머지 구간에서는 항상 증가한다.

. atan2(y, x) 컴파일시 에러가 날때
. 오버로드된 함수에 대한 호출이 모호합니다.
=> y, x의 type을 float나 double로 통일해준다.
int type으로 하거나 float, double을 섞으면 안된다.

. 예제 프로그램
#include
#include
using namespace std;

void print(int x, int y)
{
cout << "atan2(" << y << ", " << x << ") : " << atan2(y, x) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
print(0, 0); // 0
print(10, 0); // 0
print(10, 10); // Pi/4
print(0, 10); // Pi/2
print(-10, 10); // 3*Pi/4
print(-10, 0); // Pi
print(-10, -10); // -3*Pi/4
print(0, -10); // -Pi/2
print(10, -10); // -Pi/4

return 0;
}

. radian(0~Pi)을 degree(0~180)로 바꾸기
0 -> 0
Pi/4 -> 45
Pi/2 -> 90
Pi -> 180

즉) radian * 180 / Pi = degree

댓글 없음:

댓글 쓰기