프로그래밍 관련/Win API

WIndows API - #10-3 그래픽 처리 - (맵핑 - 좌표 공간과 변환)

QA Engineer - P군 2015. 10. 11. 02:53
반응형

그 동안 X,Y 좌표로 이루어진 2차원 평면 공간에 이미지나 텍스트들을 출력해 왔습니다.

WIn API에서는 4가지의 좌표 공간을 제공합니다.

 

 

월드 공간(논리 좌표를 사용하는 큰 공간) -> 페이지 공간 (논리 좌표) -> 디바이스 공간 (물리 좌표) -> 물리 장치(프린터 등등)

페이지 공간과 디바이스 공간에 대해서는 이전 시간에 맵핑을 하였기 때문에 생략하도록 하고, 이번 시간에는 월드 공간에서 페이지 공간으로 

맵핑을 하도록 하겠습니다.

월드 공간은 디폴트로 사용되어 지지 않으며, 그래픽 모드를 변경하여 사용합니다.

이전에 사용했던 페이지 공간에서 디바이스 공간으로의 맵핑 만 사용해도 원점의 이동으로 화면 이동을 쉽게 구현 할 수 있습니다. 

다만, 월드 좌표를 변환하게 되면 페이지 공간 자체를 변경하여, 다양한 좌표 변환이 가능해집니다.

월드 공간 좌표를 변환하기 위한 함수는 아래와 같습니다.

 

SetGraphicsMode

: SetGraphicsMode 함수는 지정된 디바이스 컨텍스트(DC) 에 대한 그래픽 모드를 설정합니다.

 

int SetGraphicsMode(
_In_ HDC hdc, _In_ int iMode );

 

 매개 변수   의미 
 hdc  DC(device context) 의 핸들값입니다.
 iMode   그래픽 모드 입니다. 이 매개 변수는 다음값 중 하나 일 수 있습니다.

 

GM_COMPATIBLE의 경우 디폴트로 설정된 그래픽 모드입니다.

창 뷰포트는 기본적으로 지원하며, SetMapMode를 통해 맵핑 모드의 변환을 할 수 있습니다.

 

GM_ADVANCED 는 디폴트와 다른 고급 그래픽 모드이며, 응용 프로그램의 DC에 대해한 월드 좌표를 변경해야 할 경우 해당 모드로 설정해야만 합니다.  

 

XFORM(structure)

: 월드 공간에서 페이지 공간으로의 변경 값을 지정하는 구조체 입니다.

 

 typedef struct _XFORM {
FLOAT eM11; FLOAT eM12; FLOAT eM21; FLOAT eM22; FLOAT eDx; FLOAT eDy; } XFORM, *PXFORM;

 

 매개 변수  의미
 운용  기능 
 eM11  
scaling
 수평 스케일 구성 요소입니다.
 rotation  회전 각도의 코사인 입니다.
 reflection  수평 반사의 구성 요소입니다.
 eM12  shear  수평 비례 상수 값입니다.
 rotation  회전 각도의 사인 값입니다.
 eM21  shear  수직 비례 상수 값입니다.
 rotation  회전 각도의 마이너스 사인값입니다.
 eM22  scaling  수직 스케일의 구성 요소입니다.
 rotation  회전 각도의 코사인 값입니다.
 reflection  수직 반사의 구성 요소 입니다.
 eDx  논리 단위로 수평 변환 요소입니다.
 eDy  논리 단위로 수직 변환 요소 입니다.


각 용도에 따른 운용과 의미 표는 아래와 같습니다.
자세한 내용은  https://msdn.microsoft.com/en-us/library/windows/desktop/dd145228(v=vs.85).aspx
위 링크를 참고해 주십시오.


 

SetWorldTransform

: 지정된 DC(Device Context)를 월드 공간과 페이지 공간의 이차원 선형 변환을 설정합니다.
  이 변환에는 scale , rotate , shear 또는 그래픽 출력을 변환하기 위해서 사용될 수 있습니다.

 

 BOOL SetWorldTransform(
_In_       HDC   hdc, _In_ const XFORM *lpXform );

 

 매개 변수   의미 
 hdc  DC(device context)의 핸들 값입니다.
 lpXform  변환 데이터를 포함하는 XForms의 구조에 대한 포인터입니다.

 

그럼 코드를 작성해보겠습니다. (블루로 테마를 바꾸어 봤습니다. :D)

 

[결과]

 

해당 프로그램을 실행하면 , -100, -100 좌표부터 그렸던 사각형을 볼 수 있습니다.

이전에 사용했던 SetViewPortOrgEx 함수로도 충분히 구현 가능한 내용입니다.

단, 더블 버퍼링을 하지 않았기 때문에 화면 떨림 현상이 발생합니다.

 

다음은 조금 업그레이드 해서 더블 버퍼와 함께 비트맵 이미지를 띄우고 SetViewPortOrgEx  함수로

y 좌표만 -100 상태로 처음 디바이스 공간에서 시작하도록 코딩하였습니다.

( 더블 버퍼시에 유의 할 점은 해당 기능으로 맵핑을 하더라도 결국에 논리 좌표에 그리는 것이기 때문에

 0.0 좌표부터 더블 버퍼를 하였을 경우 - 좌표로 맵핑으로 이동시에 이미지가 해당 부분만큼 다시 그려지는

 현상이 있습니다. 이 점을 참고하여 어색한 현상이 연출되지 않도록 해야합니다.)

 

[결과]


 

이제 그림도 출력하였으니 XFORM(structure)를 통한 월드 좌표 변경 기능을 조금 더 알아보겠습니다.

반응형