Condividi tramite


Importanza dell'ordine delle trasformazioni

In un singolo oggetto Matrix è possibile memorizzare un'unica trasformazione o una sequenza di trasformazioni. Quest'ultima è chiamata trasformazione composita. La matrice di una trasformazione composita viene ottenuta moltiplicando le matrici di trasformazioni singole.

Esempi di trasformazione composita

In una trasformazione composita è importante l'ordine delle singole trasformazioni. Se ad esempio si esegue prima una rotazione, poi un adattamento e quindi una traslazione si ottiene un risultato diverso da quello che si otterrebbe effettuando prima una traslazione, poi una rotazione e infine un adattamento. In GDI+ le trasformazioni composite sono compilate da sinistra a destra. Se S, R e T sono rispettivamente matrici di adattamento, rotazione e traslazione, la sequenza SRT (in quest'ordine) è la matrice della trasformazione composita che prima effettua l'adattamento, poi la rotazione, poi la traslazione. La matrice prodotta dalla sequenza SRT è diversa dalla matrice prodotta dalla sequenza TRS.

Un motivo di rilevanza dell'ordine è che le trasformazioni, come rotazione e adattamento, vengono effettuate rispetto all'origine del sistema di coordinate. Il ridimensionamento di un oggetto centrato rispetto all'origine produce un risultato diverso dal ridimensionamento di un oggetto spostato rispetto all'origine. Analogamente, la rotazione di un oggetto centrato rispetto all'origine produce un risultato diverso dalla rotazione di un oggetto spostato rispetto all'origine.

Nell'esempio che segue si uniscono, nell'ordine, adattamento, rotazione e traslazione per formare una trasformazione composita. L'argomento Append passato al metodo RotateTransform indica che la rotazione sarà successiva all'adattamento. Analogamente, l'argomento Append passato al metodo TranslateTransform indica che la traslazione sarà successiva alla rotazione. Append e Prepend sono membri dell'enumerazione MatrixOrder.

        Dim rect As New Rectangle(0, 0, 50, 50)
        Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
        e.Graphics.ResetTransform()
        e.Graphics.ScaleTransform(1.75F, 0.5F)
        e.Graphics.RotateTransform(28, MatrixOrder.Append)
        e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
        e.Graphics.DrawRectangle(pen, rect)

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.DrawRectangle(pen, rect);

Nell'esempio che segue vengono eseguite le stesse chiamate di metodo utilizzate nell'esempio precedente, ma con ordine inverso. L'ordine delle operazioni è traslazione, rotazione e quindi adattamento, con un risultato molto diverso dalla sequenza adattamento, rotazione, traslazione.

        Dim rect As New Rectangle(0, 0, 50, 50)
        Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
        e.Graphics.ResetTransform()
        e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
        e.Graphics.RotateTransform(28, MatrixOrder.Append)
        e.Graphics.ScaleTransform(1.75F, 0.5F)
        e.Graphics.DrawRectangle(pen, rect)

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);

Un modo per invertire l'ordine delle singole trasformazioni in una trasformazione composita è rappresentato dall'inversione dell'ordine di una sequenza di chiamate di metodo. Un secondo modo per controllare l'ordine delle operazioni è dato dalla modifica dell'argomento dell'ordine della matrice. L'esempio riportato di seguito si distingue dal precedente solo per il cambiamento di Append in Prepend. La moltiplicazione della matrice viene effettuata nell'ordine SRT, dove S, R e T sono, rispettivamente, le matrici per adattamento, rotazione e traslazione. L'ordine della trasformazione composita è adattamento, rotazione, traslazione.

        Dim rect As New Rectangle(0, 0, 50, 50)
        Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
        e.Graphics.ResetTransform()
        e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend)
        e.Graphics.RotateTransform(28, MatrixOrder.Prepend)
        e.Graphics.ScaleTransform(1.75F, 0.5F)
        e.Graphics.DrawRectangle(pen, rect)

Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend);
e.Graphics.RotateTransform(28, MatrixOrder.Prepend);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);

Il risultato dell'esempio precedente è identico a quello del primo esempio della sezione, poiché è stato invertito sia l'ordine delle chiamate di metodo sia l'ordine di moltiplicazione delle matrici.

Vedere anche

Riferimenti

Matrix

Altre risorse

Sistemi di coordinate e trasformazioni

Utilizzo di trasformazioni nel codice gestito GDI+