Condividi tramite


Trasformazioni globali e locali

Una trasformazione globale è una trasformazione che influisce su tutti gli elementi tracciati da un dato oggetto Graphics. Una trasformazione locale, invece, è una trasformazione che influisce su un elemento specifico da tracciare.

Trasformazioni globali

Per creare una trasformazione globale, costruire un oggetto Graphics, quindi modificarne la proprietà Transform. Tale proprietà è un oggetto Matrix, quindi è in grado di contenere qualunque sequenza di trasformazioni affini. La trasformazione memorizzata nella proprietà Transform viene denominata trasformazione complessiva. Nella classe Graphics sono disponibili svariati metodi per la compilazione di una trasformazione complessiva composta: MultiplyTransform, RotateTransform, ScaleTransform e TranslateTransform. L'esempio seguente consente di tracciare due volte un'ellisse: una volta prima della creazione di una trasformazione complessiva e una volta dopo tale creazione. Durante la trasformazione l'ellisse viene ridimensionata con un fattore di 0,5 in direzione y, quindi traslata di 50 unità in direzione x e infine ruotata di 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);

Nell'immagine seguente vengono mostrate le matrici utilizzate durante la trasformazione.

Trasformazioni

Nota

Nell'esempio precedente l'ellisse viene ruotata lungo l'origine del sistema di coordinate, situata nell'angolo superiore sinistro dell'area client. Il risultato prodotto da tale rotazione differisce dal risultato ottenuto tramite una rotazione dell'ellisse lungo il centro.

Trasformazioni locali

Un trasformazione locale influisce su uno specifico elemento da tracciare. Nell'oggetto GraphicsPath ad esempio è disponibile il metodo Transform, che consente di trasformare i singoli dati di tale percorso. L'esempio seguente consente di tracciare un rettangolo senza alcuna trasformazione e un percorso con una trasformazione di rotazione. Si supponga che non venga applicata alcuna trasformazione complessiva.

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

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

È possibile combinare trasformazioni complessive e locali per ottenere svariati risultati. È ad esempio possibile utilizzare la trasformazione complessiva per modificare il sistema di coordinate e utilizzare le trasformazioni locali per la rotazione e il ridimensionamento di oggetti tracciati nel nuovo sistema di coordinate.

Si supponga che si desideri creare un sistema di coordinate con origine situata a 200 pixel di distanza dal margine sinistro dell'area client e a 150 pixel di distanza dal margine superiore dell'area client. Si supponga inoltre che l'unità di misura desiderata siano i pixel e che l'asse x sia rivolto verso destra e l'asse y verso l'alto. L'asse y del sistema di coordinate predefinito è rivolto verso il basso. È quindi necessario effettuare una reflection lungo l'asse orizzontale. Nell'immagine seguente viene mostrata la matrice relativa a tale reflection.

Trasformazioni

Si supponga inoltre che sia necessario effettuare una traslazione di 200 unità verso destra e di 150 unità verso il basso.

L'esempio seguente consente di ottenere il sistema di coordinate appena descritto, impostando la trasformazione complessiva di un oggetto Graphics.

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

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

Il codice seguente (inserito alla fine dell'esempio precedente) consente di creare un percorso costituito da un unico rettangolo, il cui angolo inferiore sinistro è situato in corrispondenza dell'origine del nuovo sistema di coordinate. Il rettangolo viene riempito una volta senza eseguire la trasformazione locale e una volta eseguendo tale trasformazione. La trasformazione locale consiste in un ridimensionamento orizzontale con un fattore di 2, seguito da una rotazione di 30 gradi.

        ' 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)

// 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);

Nell'immagine seguente vengono mostrati il nuovo sistema di coordinate e i due rettangoli.

Trasformazioni

Vedere anche

Altre risorse

Sistemi di coordinate e trasformazioni

Utilizzo di trasformazioni nel codice gestito GDI+