본문 바로가기
개발아닌개발/C,C++

[MFC] 두 점의 좌표로 화살표 그리기

by 불청객 2023. 1. 5.
반응형

B에서 A로 향하는 화살표.

 

내가 그릴 화살표 원리

 

A의 좌표와 B의 좌표를 알때, A의 좌표를 기준으로 45도,45도로 직선 그리기

 

 

 

 

A와 B의 좌표를 알아야 하는이유는, 직선이 갖는 각도를 알아야 A에서 +-45 할 각도를 알수 있기 때문

↘↖↙↗ 윈도우상의 4분면을 고려하여, atan2 함수를 사용한다.

 

* atan2 (math.h 라이브러리 내장함수)

1사분면과 4사분면 사이가 각도(0º)의 기준이다. 1에서 2사분면은 + 0~180도,  4에서 3분면은 -0~180도

이걸 또 음수가 아닌 360도로 계산해서 풀어보려고 했다가 머리만 더썼다.. 가만히 둔다.

 

atan2를 사용하면 라디안 값이 나오는데, degree로 변환을 해주기 위해 * 180 / PI 을 연산한다.

 

 

참고로, 일반적인 각도 60도 90도로 sin, cos를 호출하면 이상한 값이 나온다. 변환 필수

 

 

 

 

 

 

 

 

 

 

 

 

코드

list_Coord[0] : B (상위 그림 참고)

list_Coord[1] : A (상위 그림 참고)

x1, y1 : 화살 직선1

x2, y2 : 화살 직선2

15 : 화살 직선의 길이

#include "math.h"
#define PI 3.1415926535897
.
.

double  m_fDegree = atan2f(list_Coord[0].y - list_Coord[1].y, list_Coord[0].x - list_Coord[1].x ) * 180 / PI;
float x1 = 0, y1 = 0, x2 = 0, y2 = 0;
double angle = m_fDegree - 45;
x1 = list_Coord[1].x + (15 * cos((angle) * (PI/180)));		// 시작점의 좌표를 더한다. , 15는 화살의 길이
y1 = list_Coord[1].y + (15 * sin((angle) * (PI/180)));		// 시작점의 좌표를 더한다. , 15는 화살의 길이

pDC->MoveTo(list_Coord[1].x, list_Coord[1].y);
pDC->LineTo(x1, y1);

angle = m_fDegree + 45;
x2 = list_Coord[1].x + (15 * cos((angle) * (PI/180)));		// 시작점의 좌표를 더한다. , 15는 화살의 길이
y2 = list_Coord[1].y + (15 * sin((angle) * (PI/180)));		// 시작점의 좌표를 더한다. , 15는 화살의 길이

pDC->MoveTo(list_Coord[1].x, list_Coord[1].y);		// 시작 점으로 이동한다.
pDC->LineTo(x2, y2);

 

 

 

 

 

실행결과

 

 

atan2에서 3,4사분면은 음수로 각도가 반환되어 그런지, y좌표는 그냥 플러스 연산하면 올바르게 화살이 그려진다.

(mfc를 이용한 윈도우 상의 좌표는 y좌표가 반대)

두 점의 좌표를 알고, 방정식, 사이 각도, 각도를 알때 좌표 등 삼각함수를 너무 많이 봐서 헷갈려서 미처 다 못적지만

자세한 수학적 계산은 삼각함수를 참고하자.

728x90
반응형

댓글