Trasformazioni globali e locali
Una trasformazione globale è una trasformazione che si applica a ogni elemento disegnato da un determinato oggetto Graphics. Al contrario, una trasformazione locale è una trasformazione che si applica a un elemento specifico da disegnare.
Trasformazioni globali
Per creare una trasformazione globale, costruire un oggetto Graphics e quindi modificarne la proprietà Transform. La proprietà Transform è un oggetto Matrix, pertanto può contenere qualsiasi sequenza di trasformazioni affine. La trasformazione archiviata nella proprietà Transform è detta trasformazione globale. La classe Graphics fornisce diversi metodi per creare una trasformazione globale composita: MultiplyTransform, RotateTransform, ScaleTransforme TranslateTransform. L'esempio seguente disegna due volte un'ellisse: una volta prima di creare una trasformazione globale e una volta dopo. La trasformazione viene prima ridimensionata in base a un fattore pari a 0,5 nella direzione y, quindi converte 50 unità nella direzione x e quindi ruota 30 gradi.
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)
La figura seguente mostra le matrici coinvolte nella trasformazione.
Nota
Nell'esempio precedente, l'ellisse viene ruotata intorno all'origine del sistema di coordinate, che si trova nell'angolo superiore sinistro dell'area del client. Questo produce un risultato diverso rispetto alla rotazione dell'ellisse sul proprio centro.
Trasformazioni locali
Una trasformazione locale si applica a un elemento specifico da disegnare. Ad esempio, un oggetto GraphicsPath ha un metodo Transform che consente di trasformare i punti dati di tale percorso. Nell'esempio seguente viene disegnato un rettangolo senza trasformazione e un percorso con una trasformazione di rotazione. Si supponga che non vi sia alcuna trasformazione del mondo.
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)
È possibile combinare la trasformazione globale con le trasformazioni locali per ottenere un'ampia gamma di risultati. Ad esempio, è possibile usare la trasformazione globale per modificare il sistema di coordinate e usare le trasformazioni locali per ruotare e ridimensionare gli oggetti disegnati nel nuovo sistema di coordinate.
Supponiamo che si desideri un sistema di coordinate con l'origine a 200 pixel dal bordo sinistro dell'area client e a 150 pixel dal bordo superiore dell'area client. Si supponga inoltre di voler che l'unità di misura sia il pixel, con l'asse x che punta a destra e l'asse y verso l'alto. Il sistema di coordinate predefinito ha l'asse y che punta verso il basso, quindi è necessario eseguire una riflessione sull'asse orizzontale. Nella figura seguente viene illustrata la matrice di tale riflessione.
Si supponga quindi di dover eseguire una traduzione di 200 unità a destra e di 150 unità verso il basso.
Nell'esempio seguente viene stabilito il sistema di coordinate appena descritto impostando la trasformazione globale di un oggetto 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)
Il codice seguente (posizionato alla fine dell'esempio precedente) crea un percorso costituito da un singolo rettangolo con l'angolo inferiore sinistro all'origine del nuovo sistema di coordinate. Il rettangolo viene riempito una volta senza alcuna trasformazione locale e una volta con una trasformazione locale. La trasformazione locale è costituita da un ridimensionamento orizzontale di un fattore pari a 2 seguito da una rotazione di 30 gradi.
// 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)
La figura seguente mostra il nuovo sistema di coordinate e i due rettangoli.
Vedere anche
.NET Desktop feedback