Trasformazioni globali e locali

Una trasformazione globale è una trasformazione che si applica a ogni elemento disegnato da un determinato oggetto Graphics . Per creare una trasformazione globale, costruire un oggetto Graphics e quindi chiamare il metodo Graphics::SetTransform . Il metodo Graphics::SetTransform modifica un oggetto Matrix associato all'oggetto Graphics . La trasformazione archiviata in tale oggetto Matrix è denominata trasformazione mondiale. La trasformazione mondiale può essere una semplice trasformazione affine o una sequenza complessa di trasformazioni affine, ma indipendentemente dalla complessità, la trasformazione mondiale viene archiviata in un singolo oggetto Matrix .

La classe Graphics offre diversi metodi per la creazione di una trasformazione globale composita: Graphics::MultipliTransform, Graphics::RotateTransform, Graphics::ScaleTransform e Graphics::TranslateTransform. L'esempio seguente disegna due volte i puntini di sospensione: una volta prima di creare una trasformazione mondiale e una volta dopo. La trasformazione viene prima ridimensionata da 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.0f, 0.5f);
myGraphics.TranslateTransform(50.0f, 0.0f, MatrixOrderAppend);
myGraphics.RotateTransform(30.0f, MatrixOrderAppend);
myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);

La figura seguente mostra i puntini di sospensione originali e i puntini di sospensione trasformati.

schermata di una finestra contenente due puntini di sospensione sovrapposti; uno è più stretto e ruotato

Nota

Nell'esempio precedente, i puntini di sospensione vengono ruotati sull'origine del sistema di coordinate, che si trova nell'angolo superiore sinistro dell'area client. Questo produce un risultato diverso rispetto alla rotazione dei puntini di sospensione sul proprio centro.

 

Una trasformazione locale è una trasformazione che si applica a un elemento specifico da disegnare. Ad esempio, un oggetto GraphicsPath ha un metodo GraphicsPath::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 mondiale.

 
Matrix myMatrix;
myMatrix.Rotate(45.0f);
myGraphicsPath.Transform(&myMatrix);
myGraphics.DrawRectangle(&myPen, 10, 10, 100, 50);
myGraphics.DrawPath(&myPen, &myGraphicsPath);

È possibile combinare la trasformazione mondiale con trasformazioni locali per ottenere un'ampia gamma di risultati. Ad esempio, è possibile usare la trasformazione mondiale per rivedere il sistema di coordinate e usare 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 che punta 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. La figura seguente mostra la matrice di tale riflessione.

illustrazione che mostra una matrice di tre by-tre

Si supponga quindi di dover eseguire una traduzione di 200 unità a destra e di 150 unità in basso.

Nell'esempio seguente viene stabilito il sistema di coordinate appena descritto impostando la trasformazione mondiale di un oggetto Graphics .

Matrix myMatrix(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
myGraphics.SetTransform(&myMatrix);
myGraphics.TranslateTransform(200.0f, 150.0f, MatrixOrderAppend);

Il codice seguente (inserito dopo il codice nell'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 trasformazione locale e una volta con una trasformazione locale. La trasformazione locale è costituita da una scalabilità orizzontale da un fattore pari a 2 seguito da una rotazione a 30 gradi.

// Create the path.
GraphicsPath myGraphicsPath;
Rect myRect(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRect);

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

// Transform the path.
Matrix myPathMatrix;
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrderAppend);
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.

schermata di un asse x e y e un quadrato blu sovrapposto da una rectagle semi-trasparente ruotato intorno all'angolo inferiore sinistro