[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 해주면 된다.


댓글

이 블로그의 인기 게시물

[Python] 파이썬에서 Opencv를 이용해 웹캠 영상 읽어오기 및 저장

[MFC] 에디트 컨트롤에 계속 문자열 추가하기(List log)

[Python] OpenCv를 이용하여 마우스 위치 가져오기