[C++] 각도, 길이로 원하는 좌표값 구하기

이번 글에서는 특정한 좌표에서 각도, 거리를 입력했을 때 좌표를 구하는 방법을 알아보겠습니다.

해당 방법을 알기 위해서 삼각함수(sin, cos)를 사용해야하는데 이 함수들은 매개변수로 라디안을 사용합니다.
보통 일반적으로 사용하는 0도, 90도, 180도 등등은 60분법(Degree)이라 합니다.

그리고 라디안은 호의 길이를 이용한 호도법(Radian)을 사용하는데, 예를 들어 반지름이 r인 원에서, 호 AB가 길이가 r일 경우, 그 각을 a라 해봅시다.

이 부채꼴 호의 중심각인 a의 경우 반지름의 길이에 상관없이 항상 일정한 값을 가지게 되는데 이것을 1radian이라고 합니다.
아무튼 삼각함수는 이 radian을 사용한다고 생각하시면 됩니다.

이 60분법과 호도법의 변환하는 방식을 전처리기 함수로 처리하면 아래와 같습니다.

#define PI 3.141592
#define DEGREE_TO_RADIAN(degree) ((PI/180)*(degree)) // 60분법 -> 호도법
#define RADIAN_TO_DEGREE(radian) ((180/PI)*(radian)) // 호도법 -> 60분법

cosine은 삼각함수에서 밑변/빗변이므로 아래 그림과 같이 새로운 x좌표를 구할 수 있습니다.

sine은 삼각함수에서 높이/빗변이므로 아래 그림과 같이 새로운 y좌표를 구할 수 있습니다.

위 그림은 (0, 0)에서 새로운 좌표를 구하는 그림입니다. 만약 (x, y)에서 구한다고 하면 아래와 그림과 같이 새로운 좌표를 구할 수 있습니다.

위 내용을 코드로 옮기면 아래와 같습니다.

#include <math.h>
#define PI 3.141592
#define DEGREE_TO_RADIAN(degree) ((PI/180)*(degree))
#define RADIAN_TO_DEGREE(radian) ((180/PI)*(radian))

// ...
int iX = 10, iY = 20;
int iR = 30;
double dRadian = DEGREE_TO_RADIAN(m_iDegree);

int iNewX = iX + iR * cos( dRadian );
int iNewY = iY + iR * sin( dRadian );

위 식을 응용하면 아래와 같이 프로그램을 만들 수 있습니다.

추가적으로 MFC 상에서 각도의 시작은 아래와 같이 x축을 기준으로 아래 방향으로 진행 됩니다.