다음을 통해 공유


전역 및 지역 변환

전역 변환은 지정된 Graphics 개체가 그린 모든 항목에 적용되는 변환입니다. 전역 변환을 만들려면 Graphics 개체를 생성한 다음 Graphics::SetTransform 메서드를 호출합니다 . Graphics::SetTransform 메서드는 Graphics 개체와 연결된 Matrix 개체를 조작합니다. 해당 Matrix 개체에 저장된 변환을 월드 변환이라고 합니다. 월드 변환은 간단한 아핀 변환 또는 복잡한 아핀 변환 시퀀스일 수 있지만 복잡성에 관계없이 월드 변환은 단일 Matrix 개체에 저장됩니다.

Graphics 클래스는 그래픽::MultiplyTransform, Graphics::RotateTransform, Graphics::ScaleTransform 및 Graphics::TranslateTransform과 같은 복합 월드 변환을 빌드하기 위한 여러 메서드를 제공합니다. 다음 예제에서는 타원을 두 번 그립니다. 한 번은 월드 변환을 만들기 전과 한 번은 만든 후입니다. 변환은 먼저 y 방향으로 0.5배율로 스케일링한 다음, x 방향으로 50단위를 변환한 다음, 30도 회전합니다.

myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1.0f, 0.5f);
myGraphics.TranslateTransform(50.0f, 0.0f, MatrixOrderAppend);
myGraphics.RotateTransform(30.0f, MatrixOrderAppend);
myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);

다음 그림에서는 원래 타원과 변환된 타원을 보여 줍니다.

두 개의 겹치는 타원을 포함하는 창의 스크린샷; 하나는 더 좁아지고 회전됩니다.

참고

이전 예제에서 타원은 클라이언트 영역의 왼쪽 위 모서리에 있는 좌표계의 원점에 대해 회전됩니다. 이렇게 하면 타원을 자체 가운데로 회전하는 것과는 다른 결과가 생성됩니다.

 

로컬 변환은 그릴 특정 항목에 적용되는 변환입니다. 예를 들어 GraphicsPath 개체에는 해당 경로의 데이터 요소를 변환할 수 있는 GraphicsPath::Transform 메서드가 있습니다. 다음은 변환 없이 직사각형을 그리고 회전 변환이 있는 경로를 그리는 예제입니다. (월드 변환이 없다고 가정합니다.)

 
Matrix myMatrix;
myMatrix.Rotate(45.0f);
myGraphicsPath.Transform(&myMatrix);
myGraphics.DrawRectangle(&myPen, 10, 10, 100, 50);
myGraphics.DrawPath(&myPen, &myGraphicsPath);

월드 변환을 로컬 변환과 결합하여 다양한 결과를 얻을 수 있습니다. 예를 들어 월드 변환을 사용하여 좌표계를 수정하고, 로컬 변환을 사용하여 새 좌표계에 그려진 개체를 회전하고 스케일링할 수 있습니다.

클라이언트 영역의 왼쪽 가장자리에서 200픽셀, 클라이언트 영역 위쪽에서 150픽셀의 원점이 있는 좌표계를 사용한다고 가정합니다. 또한 x축이 오른쪽을 가리키고 y축이 위쪽을 가리키도록 측정 단위를 픽셀로 지정한다고 가정합니다. 기본 좌표계에는 y축이 아래쪽을 가리키므로 가로 축에서 리플렉션을 수행해야 합니다. 다음 그림에서는 이러한 리플렉션의 행렬을 보여 줍니다.

3-by-3 행렬을 보여 주는 그림

다음으로, 오른쪽으로 200단위, 아래로 150단위 변환을 수행해야 한다고 가정합니다.

다음 예제에서는 Graphics 개체의 월드 변환을 설정하여 방금 설명한 좌표계를 설정합니다.

Matrix myMatrix(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
myGraphics.SetTransform(&myMatrix);
myGraphics.TranslateTransform(200.0f, 150.0f, MatrixOrderAppend);

다음 코드(이전 예제의 코드 다음에 배치됨)는 새 좌표계의 원점에서 왼쪽 아래 모서리가 있는 단일 사각형으로 구성된 경로를 만듭니다. 사각형은 로컬 변환 없이 한 번 채워지고 한 번은 로컬 변환으로 채워집니다. 로컬 변환은 2배의 수평 스케일링, 30도 회전으로 구성됩니다.

// Create the path.
GraphicsPath myGraphicsPath;
Rect myRect(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRect);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(&mySolidBrush1, &myGraphicsPath);

// Transform the path.
Matrix myPathMatrix;
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrderAppend);
myGraphicsPath.Transform(&myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(&mySolidBrush2, &myGraphicsPath);

다음 그림에서는 새 좌표계와 두 사각형을 보여 줍니다.

x축과 y축의 스크린샷, 반투명 사각형으로 오버레이된 파란색 사각형이 왼쪽 아래 모서리를 중심으로 회전합니다.