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 형이다.
월드 좌표는 우리가 설정할 수 있는 x, y 와 거리 이동을 위해서 추가된 1이 합쳐진 3차원 벡터이다.
즉 [x, y, 1] 이라는 것.
이 벡터가 위의 행렬과 곱해져 계산되는 것이다.
자세한 공식은 Linear Argebra 책을 들고오자.
2. 맵핑모드
윈도우즈의 좌표 종류
윈도우즈의 논리 좌표 -> 물리 좌표 로의 맵핑 모드
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);
에서 얻은 값을 사용하여, 모니터에 보이는 윈도우의 크기에 따라 논리 좌표를 변환하는 것이다.
댓글 없음:
댓글 쓰기