반응형
내가 그릴 화살표 원리
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
반응형
'개발아닌개발 > C,C++' 카테고리의 다른 글
[MFC] 원하는 각도의 좌표 값 구해서 직선 그리기 (0) | 2023.02.15 |
---|---|
[C,C++] visual studio 2008 디버그 출력창에 Trace 로그 안나옴 (0) | 2023.02.07 |
[MFC] shapefile(shapeLib-1.5.0) c++ 오픈소스 라이브러리 컴파일하기 (0) | 2022.05.13 |
[MFC] SDI 메뉴 모음(m_wndMenuBar) 없애기 (0) | 2022.04.29 |
[MFC/C,C++] 가변 인자를 이용하여 WORD 배열 Define 선언하기 (0) | 2022.04.19 |
댓글