Udostępnij za pośrednictwem


Globalne i lokalne transformacje

Transformacja globalna to przekształcenie, które ma zastosowanie do każdego elementu rysowanego przez dany Graphics obiekt. Natomiast przekształcenie lokalne to przekształcenie, które ma zastosowanie do określonego elementu do narysowania.

Przekształcenia globalne

Aby utworzyć transformację globalną, skonstruuj obiekt, a następnie manipuluj Graphics jego Transform właściwością. Właściwość Transform jest obiektem, więc może zawierać dowolną Matrix sekwencję przekształceń affine. Transformacja przechowywana we Transform właściwości jest nazywana transformacją świata. Klasa Graphics udostępnia kilka metod tworzenia złożonej transformacji świata: MultiplyTransform, , RotateTransformScaleTransformi TranslateTransform. W poniższym przykładzie dwukrotnie rysuje wielokropek: raz przed utworzeniem transformacji świata i raz po. Transformacja najpierw skaluje według współczynnika 0,5 w kierunku y, a następnie tłumaczy 50 jednostek w kierunku x, a następnie obraca się o 30 stopni.

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)
myGraphics.ScaleTransform(1, 0.5F)
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append)
myGraphics.RotateTransform(30, MatrixOrder.Append)
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)

Na poniższej ilustracji przedstawiono macierze zaangażowane w transformację.

Illustration of the Scale, Translate, and Rotate matrices combining to form the global transformation.

Uwaga

W poprzednim przykładzie wielokropek jest obracany o pochodzeniu układu współrzędnych, który znajduje się w lewym górnym rogu obszaru klienta. Daje to inny wynik niż obracanie wielokropka o własnym centrum.

Przekształcenia lokalne

Przekształcenie lokalne ma zastosowanie do określonego elementu do narysowania. Na przykład GraphicsPath obiekt ma metodę umożliwiającą Transform przekształcenie punktów danych tej ścieżki. Poniższy przykład rysuje prostokąt bez przekształcenia i ścieżkę z przekształceniem obrotu. (Załóżmy, że nie ma transformacji świata).

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);
Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)

Możesz połączyć transformację świata z lokalnymi transformacjami, aby uzyskać wiele wyników. Na przykład można użyć transformacji świata, aby skorygować układ współrzędnych i użyć przekształceń lokalnych do obracania i skalowania obiektów rysowanych w nowym układzie współrzędnych.

Załóżmy, że chcesz mieć układ współrzędnych, który ma początek 200 pikseli od lewej krawędzi obszaru klienta i 150 pikseli w górnej części obszaru klienta. Ponadto załóżmy, że jednostka miary ma być pikselem z osią x wskazującą prawą i oś y skierowaną w górę. Domyślny system współrzędnych ma oś y skierowaną w dół, więc należy wykonać odbicie na osi poziomej. Na poniższej ilustracji przedstawiono macierz takiego odbicia.

Illustration of a matrix that reflects across the horizontal axis.

Następnie załóżmy, że musisz wykonać tłumaczenie 200 jednostek po prawej stronie i 150 jednostek w dół.

Poniższy przykład ustanawia układ współrzędnych opisany właśnie przez ustawienie transformacji Graphics świata obiektu.

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);
Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
myGraphics.Transform = myMatrix
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)

Poniższy kod (umieszczony na końcu poprzedniego przykładu) tworzy ścieżkę składającą się z pojedynczego prostokąta z lewym dolnym róg u źródła nowego układu współrzędnych. Prostokąt jest wypełniany raz bez przekształcenia lokalnego i raz za pomocą przekształcenia lokalnego. Transformacja lokalna składa się ze skalowania w poziomie przez współczynnik 2, po którym następuje obrót 30 stopni.

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

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

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);
' Create the path.
Dim myGraphicsPath As New GraphicsPath()
Dim myRectangle As New Rectangle(0, 0, 60, 60)
myGraphicsPath.AddRectangle(myRectangle)

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

' Set the local transformation of the GraphicsPath object.
Dim myPathMatrix As New Matrix()
myPathMatrix.Scale(2, 1)
myPathMatrix.Rotate(30, MatrixOrder.Append)
myGraphicsPath.Transform(myPathMatrix)

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

Na poniższej ilustracji przedstawiono nowy układ współrzędnych i dwa prostokąty.

Illustration of the new coordinate system and the two rectangles.

Zobacz też