[C/C++, MFC] 이미지 상 두 점의 각도 구하기
두 점간의 각도를 구하는 방법을 검색하면 거의 대부분의 글에서 atan2 함수를 사용하여
그 각도를 구하라고 한다.
#include <cmath>
BOOL CalculateAngle(CPoint pt1, CPoint pt2, double& dAngle)
{
BOOL bResult = FALSE;
if (pt1 != pt2)
{
dAngle = atan2(pt2.y - pt1.y, pt2.x - pt1.x);
dAngle *= (180.0 / M_PI);
bResult = TRUE;
}
return bResult;
}
이런 글을 보고 만든 함수가 위의 함수이다.
같은 포인트가 아닐 시 atan2 함수를 사용하여 각도를 구하고
그 결과값이 라디안 값이니 degree 값으로 바꾸는 함수이다.
이 함수를 사용해서 이미지 상 두 점의 각도를 구하니 계속 부호가 반대로 나오는 것이었다.
다음과 같이 이미지 상에 두 점 A, B가 있다고 하자
그럼 보통 우리가 생각하는 x,y 2차원 좌표상엔 B 점의 y 값이 높다.
원점(영점)이 좌하단에 위치하기 때문이다.
하지만 이미지를 다룰땐 이와 반대로 좌상단에 원점(영점)이 존재한다.
따라서 위와 같은 함수 식으론 계속 부호가 반대로 나오게 되는 것이다.
A 좌표를 (100, 70) 이라 한다면 B 좌표는 (200, 40) 정도가 되어
atan2(-30, 100) 이라는 값이 들어가 마이너스 부호가 나오는 것이었다.
이미지의 특징을 생각 못한 것이었다.
따라서 함수를 다시 만들자면
#include <cmath>
BOOL CalculateAngle(CPoint pt1, CPoint pt2, double& dAngle)
{
BOOL bResult = FALSE;
if (pt1 != pt2)
{
dAngle = atan2((pt2.y - pt1.y) * -1, pt2.x - pt1.x);
dAngle *= (180.0 / M_PI);
bResult = TRUE;
}
return bResult;
}
위 와 같이 -1을 곱해주거나 pt1.y - pt2.y 로 바꾸어 주는 등의 방법을 사용하여야
원하는 정확한 각도를 얻을 수 있을 것이다.
아 그리고 위 결과 값은 0~180, 0~-180 값으로 나오니 360도를 기준으로 출력하고 싶으면 마이너스 값일 때 + 360 해주면 된다.
댓글
댓글 쓰기