Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Transformacja globalna to przekształcenie, które ma zastosowanie do każdego elementu rysowanego przez dany obiekt Graphics. 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 Graphics, a następnie manipuluj jego właściwością Transform. Właściwość Transform jest obiektem Matrix, dzięki czemu może przechowywać dowolną sekwencję przekształceń affine. Transformacja przechowywana we właściwości Transform jest nazywana transformacją świata. Klasa Graphics udostępnia kilka metod tworzenia złożonej transformacji świata: MultiplyTransform, RotateTransform, ScaleTransformi TranslateTransform. W poniższym przykładzie dwukrotnie rysuje elipsę: 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ę.
Uwaga / Notatka
W poprzednim przykładzie elipsa jest obracana wokół początku układu współrzędnych, który znajduje się w lewym górnym rogu obszaru wyświetlania. Daje to inny wynik niż obracanie elipsy o własnym centrum.
Przekształcenia lokalne
Przekształcenie lokalne ma zastosowanie do elementu, który ma być narysowany. Na przykład obiekt GraphicsPath ma metodę Transform, która umożliwia przekształcenie punktów danych tej ścieżki. Poniższy przykład rysuje prostokąt bez przekształcenia i ścieżkę z transformacją obrotową. (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 skierowaną w prawo i osią 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.
Następnie załóżmy, że musisz wykonać przesunięcie o 200 jednostek w prawo i 150 jednostek w dół.
W poniższym przykładzie opisano właśnie układ współrzędnych, ustawiając transformację świata obiektu Graphics.
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 rogiem w punkcie początkowym 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ę z poziomego skalowania o współczynnik 2, a następnie obrotu o 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.
Zobacz także
.NET Desktop feedback