Condividi tramite


Importanza dell'ordine delle trasformazioni

Un singolo oggetto Matrix può archiviare una singola trasformazione o una sequenza di trasformazioni. Quest'ultimo è chiamato unatransformazione composita. La matrice di una trasformazione composita viene ottenuta moltiplicando le matrici delle singole trasformazioni.

In una trasformazione composita l'ordine delle singole trasformazioni è importante. Ad esempio, se si ruota prima, quindi si ridimensiona, si ottiene un risultato diverso rispetto a se si converte prima, quindi ruotare, quindi ridimensionare. In Windows GDI+, le trasformazioni composte vengono compilate da sinistra a destra. Se rispettivamente S, R e T sono matrici di scalabilità, rotazione e traduzione, il prodotto SRT (in tale ordine) è la matrice della trasformazione composita che prima ridimensiona, quindi ruota, quindi converte. La matrice prodotta dal prodotto SRT è diversa dalla matrice prodotta dal prodotto TRS.

Un ordine di motivo è significativo è che le trasformazioni come la rotazione e la scalabilità vengono eseguite rispetto all'origine del sistema di coordinate. Il ridimensionamento di un oggetto centrato all'origine genera un risultato diverso rispetto al ridimensionamento di un oggetto spostato dall'origine. Analogamente, la rotazione di un oggetto centrato all'origine genera un risultato diverso rispetto alla rotazione di un oggetto spostato dall'origine.

Nell'esempio seguente viene combinata la scalabilità, la rotazione e la traduzione (in tale ordine) per formare una trasformazione composita. L'argomento MatrixOrderAppend passato al metodo Graphics::RotateTransform specifica che la rotazione seguirà il ridimensionamento. Analogamente, l'argomento MatrixOrderAppend passato al metodo Graphics::TranslateTransform specifica che la traduzione seguirà la rotazione.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.ScaleTransform(1.75f, 0.5f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.TranslateTransform(150.0f, 150.0f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

L'esempio seguente esegue le chiamate allo stesso metodo dell'esempio precedente, ma l'ordine delle chiamate viene invertito. L'ordine risultante delle operazioni viene innanzitutto convertito, quindi ruotare, quindi ridimensionare, che genera un risultato molto diverso rispetto alla prima scala, quindi ruotare, quindi tradurre:

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

Un modo per invertire l'ordine delle singole trasformazioni in una trasformazione composita consiste nel invertire l'ordine di una sequenza di chiamate al metodo. Un secondo modo per controllare l'ordine delle operazioni consiste nel modificare l'argomento ordine matrice. L'esempio seguente è lo stesso dell'esempio precedente, ad eccezione del fatto che MatrixOrderAppend è stato modificato in MatrixOrderPrepend. La moltiplicazione della matrice viene eseguita rispettivamente nell'ordine SRT, in cui S, R e T sono le matrici per la scala, ruotare e tradurre rispettivamente. L'ordine della trasformazione composita è innanzitutto ridimensionato, quindi ruotare, quindi tradurre.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f,MatrixOrderPrepend);
graphics.RotateTransform(28.0f, MatrixOrderPrepend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderPrepend);
graphics.DrawRectangle(&pen, rect);

Il risultato dell'esempio precedente è lo stesso risultato ottenuto nel primo esempio di questa sezione. Ciò avviee perché è stato invertito sia l'ordine delle chiamate del metodo che l'ordine della moltiplicazione della matrice.