Trasformazioni globali e locali

Una trasformazione globale è una trasformazione che si applica a ogni elemento disegnato da un determinato Graphics oggetto. 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 Graphics oggetto e quindi modificarne la Transform proprietà. La Transform proprietà è un Matrix oggetto, in modo che possa contenere qualsiasi sequenza di trasformazioni affine. La trasformazione archiviata nella Transform proprietà è denominata trasformazione globale. La Graphics classe 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.

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

Nota

Nell'esempio precedente l'ellisse viene ruotata sull'origine del sistema di coordinate, che si trova nell'angolo superiore sinistro dell'area 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 GraphicsPath oggetto ha un Transform metodo 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.

Si supponga di volere un sistema di coordinate con origine 200 pixel dal bordo sinistro dell'area client e 150 pixel dalla parte 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 reflection sull'asse orizzontale. Nella figura seguente viene illustrata la matrice di tale reflection.

Illustration of a matrix that reflects across the horizontal axis.

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 Graphics oggetto .

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.

Illustration of the new coordinate system and the two rectangles.

Vedi anche