2020년 7월 1일 수요일

WinAPI - 디스플레이 좌표공간

0. 좌표 공간

WinApi 에서 좌표 공간은 총 4가지로 이루어져 있다.

월드 공간 -> 페이지 공간 -> 디바이스 공간 -> 물리 장치

월드 공간은 Default 로는 사용되지 않으며, 바로 페이지 공간을 사용한다.

월드공간을 사용하면 그리기 함수에서 사용하는 좌표가 월드 공간의 좌표가 된다.

사용하지 않으면 페이지 공간 좌표가 기준이 된다.

int SetGraphicsMode ( HDC hdc, int iMode);

위 함수에서 월드 공간 사용 옵션을 설정한다.

GM_COMPATIBLE 은 디폴트, GM_ADVANCED 는 월드 공간을 사용하는 설정이다.

각 공간에서 사용하는 좌표는 변환이 된다.

월드 공간 -> 페이지 공간 은 변환 행렬 곱을 해주는 함수로 처리하며

페이지 공간 -> 디바이스 공간 은 '맵핑모드' 라는 설정을 통해서 이루어지며

디바이스 공간 -> 물리 장치 는 디바이스 드라이버 내에서 처리한다.

1. 월드 변환

BOOL SetWorldTransform ( HDC hdc, Const XFORM* lpXform);

위 함수에서 XFORM 이 변환 행렬의 자료형이다.

아래 표는 XFORM 의 멤버 이름을 3X3 행렬에 적은 것이다. 모두 Float 형이다.

eM11

eM12

0

eM21

eM22

0

eDx

eDy

1

월드 좌표는 우리가 설정할 수 있는 x, y 와 거리 이동을 위해서 추가된 1이 합쳐진 3차원 벡터이다.

즉 [x, y, 1] 이라는 것.

이 벡터가 위의 행렬과 곱해져 계산되는 것이다.

자세한 공식은 Linear Argebra 책을 들고오자.

2. 맵핑모드

윈도우즈의 좌표 종류

논리 좌표

윈도우즈 내부 혹은 DC 에서 사용하는 좌표.

아래 VeiwPort 와 대립되는 것이 윈도우

물리 좌표

실제 화면에 출력되는 좌표. 단위는 픽셀.

물리좌표가 사용되는 영역을 VeiwPort 라고 한다.

윈도우즈의 논리 좌표 -> 물리 좌표 로의 맵핑 모드

MM_TEXT

픽셀 단위

오른쪽 x 좌표 증가

아래 y 좌표 증가

Default

MM_LOMETRIC

0.1mm

위 y 좌표 증가

_

MM_HIMETRIC

0.01mm

MM_LOENGLISH

0.01 inch

MM_HIENGLISH

0.001 inch

MM_TWIPS

1/1440 inch

MM_ISOTROPIC

윈도우의 크기에 따라 가변

가변

가변

비율이 일정하게 유지

MM_ANISOTROPIC

화면 크기에 따라 비율이 바뀜

int SetMapMode (HDC hdc, int fnMapMode);

int GetMapMode (HDC hdc );

으로 설정

BOOL SetViewportOrgEx(HDC hdc, int x, int y, LPPOINT lpPoint);

BOOL SetWindowOrgEx(HDC hdc, int x, int y, LPPOINT lpPoint);

위 함수로 원점을 바꿀 수 있다. (디폴트는 우측 상단)

lpPoint 는 변경하기 이전의 원점을 얻기 위한 인자.

BOOL SetWindowExEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize);

BOOL SetVeiwportExEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize);

가변 변환을 사용하는 경우 논리 좌표의 영역과 물리 좌표의 영역을 설정해야한다.

전자의 함수로 변환할 논리 좌표의 크기를 원점을 기준으로 설정한다.

후자의 함수로 변환될 물리 영역의 크기를 원점을 기준으로 설정한다.

후자의 함수에서 잘 쓰는 기법은

GetClientRect(hWnd, &rect);

에서 얻은 값을 사용하여, 모니터에 보이는 윈도우의 크기에 따라 논리 좌표를 변환하는 것이다.

댓글 없음:

댓글 쓰기

List