Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo argomento viene fornita una panoramica matematica delle trasformazioni di matrice per la grafica 2D. Tuttavia, non è necessario conoscere la matematica della matrice per usare le trasformazioni in Direct2D. Leggere questo argomento se si è interessati alla matematica; in caso contrario, è possibile ignorare questo argomento.
- introduzione alle matrici
- trasformazioni Affine
- rappresentazione di trasformazioni in Direct2D
- successivo
Introduzione alle matrici
Una matrice è una matrice rettangolare di numeri reali. L'ordine della matrice è il numero di righe e colonne. Ad esempio, se la matrice ha 3 righe e 2 colonne, l'ordine è 3 × 2. Le matrici vengono in genere visualizzate con gli elementi matrice racchiusi tra parentesi quadre:
Notazione: una matrice è designata da una lettera maiuscola. Gli elementi sono designati da lettere minuscole. I pedice indicano il numero di riga e di colonna di un elemento. Ad esempio, unij è l'elemento nella riga i e nella colonna j'th della matrice A.
Il diagramma seguente mostra una matrice i × j, con i singoli elementi in ogni cella della matrice.
Operazioni matrice
In questa sezione vengono descritte le operazioni di base definite sulle matrici.
addizione. La somma A + B di due matrici viene ottenuta aggiungendo gli elementi corrispondenti di A e B:
- A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]
moltiplicazione scalare. Questa operazione moltiplica una matrice per un numero reale. Dato un numero reale k, il prodotto scalare kA viene ottenuto moltiplicando ogni elemento di A per k.
- kA = k\[ a*ij* \] = \[ k × a*ij* \]
moltiplicazione matrice. Date due matrici A e B con ordine (m × n) e (n × p), il prodotto C = A × B è una matrice con ordine (m × p), definito come segue:
oppure, in modo equivalente:
- c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*
Ovvero, per calcolare ogni elemento cij, eseguire le operazioni seguenti:
- Prendi la i'th riga di A e la colonna j'th di B.
- Moltiplicare ogni coppia di elementi nella riga e nella colonna: la prima voce di riga per la prima voce di colonna, la seconda voce di riga per la seconda voce di colonna e così via.
- Sommare il risultato.
Di seguito è riportato un esempio di moltiplicazione di una matrice (2 × 2) per una matrice (2 × 3).
La moltiplicazione della matrice non è commutativa. Ovvero, A × B ≠ B × A. Inoltre, dalla definizione segue che non tutte le coppie di matrici possono essere moltiplicate. Il numero di colonne nella matrice a sinistra deve corrispondere al numero di righe nella matrice di destra. In caso contrario, l'operatore × non è definito.
Identificare la matrice. Una matrice di identità, designata I, è una matrice quadrata definita come segue:
- I*ij* = 1 se *i* = *j*, o 0 in caso contrario.
In altre parole, una matrice identity contiene 1 per ogni elemento in cui il numero di riga è uguale al numero di colonna e zero per tutti gli altri elementi. Ad esempio, ecco la matrice di identità 3 × 3.
Gli equalità seguenti sono contenuti per qualsiasi matrice M.
- M x I = M I x M = M
Trasformazioni affine
Una trasformazione affine è un'operazione matematica che esegue il mapping di uno spazio di coordinate a un altro. In altre parole, esegue il mapping di un set di punti a un altro set di punti. Le trasformazioni affine hanno alcune funzionalità che li rendono utili nella grafica del computer.
- Le trasformazioni affine mantengono collinearità. Se tre o più punti cadono su una linea, formano comunque una linea dopo la trasformazione. Le linee rette rimangono dritte.
- La composizione di due trasformazioni affine è una trasformazione affine.
Le trasformazioni affine per lo spazio 2D hanno il formato seguente.
Se si applica la definizione della moltiplicazione della matrice specificata in precedenza, è possibile mostrare che il prodotto di due trasformazioni affine è un'altra trasformazione affine. Per trasformare un punto 2D usando una trasformazione affine, il punto viene rappresentato come una matrice 1 × 3.
- P = \| x y 1 \|
I primi due elementi contengono le coordinate x e y del punto. Il valore 1 viene inserito nel terzo elemento per far funzionare correttamente la matematica. Per applicare la trasformazione, moltiplicare le due matrici come indicato di seguito.
- P' = P × M
In questo modo si espande quanto segue.
dove
- x' = ax + cy + e y' = bx + dy + f
Per ottenere il punto trasformato, prendere i primi due elementi della matrice P'.
- p = (x', y') = (ax + cy + e, bx + dy + f)
Nota
Una matrice di 1 × n è denominata vettore di riga . Direct2D e Direct3D usano entrambi vettori di riga per rappresentare i punti nello spazio 2D o 3D. È possibile ottenere un risultato equivalente usando un vettore di colonna (n × 1) e trasponendo la matrice di trasformazione. La maggior parte dei testi grafici usa il formato vettore di colonna. In questo argomento viene presentato il formato del vettore di riga per la coerenza con Direct2D e Direct3D.
Le sezioni successive derivano le trasformazioni di base.
Trasformazione traduzione
La matrice di trasformazione traslazione ha il formato seguente.
L'inserimento di un punto P in questa equazione produce:
- P' = (*x* + *dx*, *y* + *dy*)
che corrisponde al punto (x, y) tradotto da dx nell'asse X e dy nell'asse Y.
Ridimensionamento della trasformazione
La matrice di trasformazione del ridimensionamento ha il formato seguente.
L'inserimento di un punto P in questa equazione produce:
- P' = (*x* * * * *dx*, *y* * * *dy*)
che corrisponde al punto (x,y) ridimensionato da dx e dy .
Rotazione intorno all'origine
La matrice per ruotare un punto intorno all'origine ha il formato seguente.
Il punto trasformato è:
- P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)
Prova. Per mostrare che P' rappresenta una rotazione, considerare il diagramma seguente.
Dedito:
-
P = (x,y)
-
Punto originale da trasformare.
-
Φ
-
Angolo formato dalla linea (0,0) a P.
-
Θ
-
Angolo in base al quale ruotare (x,y) circa l'origine.
-
P' = (x',y')
-
Punto trasformato.
-
R
-
Lunghezza della linea (da 0,0) a P. Anche il raggio del cerchio di rotazione.
Nota
Questo diagramma usa il sistema di coordinate standard usato nella geometria, in cui l'asse y positivo punta verso l'alto. Direct2D usa il sistema di coordinate Windows, in cui l'asse y positivo punta verso il basso.
L'angolo tra l'asse x e la linea (0,0) a P' è Θ + Θ. Le identità seguenti contengono:
- x = R cosΓ y = R sinΘ x' = R cos(Θ + Θ) y' = R sin(Θ+ Θ)
Ora risolvi x' e y' in termini di Θ. In base alle formule di addizione trigonometriche:
- x' = R(cosΘcosΘ – sinΘsinΘ) = RcosΓcosΘ – RsinΘsinΘ y' = R(sinΘcosΘ + cosΘsinΘ) = RsinΘcosΘ + RcosΓsinΘ
Sostituendo, si ottiene:
- x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ
che corrisponde al punto trasformato P' mostrato in precedenza.
Rotazione intorno a un punto arbitrario
Per ruotare intorno a un punto (x,y) diverso dall'origine, viene usata la matrice seguente.
È possibile derivare questa matrice prendendo il punto (x,y) come origine.
Lasciare (x1, y1) essere il punto risultante dalla rotazione del punto (x0, y0) intorno al punto (x,y). È possibile derivare x1 come indicato di seguito.
- x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]
Ora ricollegare questa equazione alla matrice di trasformazione, usando la formula x1 = ax0 + cy0 + e di precedenza. Utilizzare la stessa procedura per derivare y1.
Trasformazione asimmetria
La trasformazione asimmetria è definita da quattro parametri:
- Θ: quantità di inclinazione lungo l'asse x, misurata come angolo dall'asse y.
- Ø: quantità di asimmetria lungo l'asse y, misurata come angolo dall'asse x.
- (px, py): le coordinate x e y del punto su cui viene eseguita l'asimmetria.
La trasformazione asimmetria usa la matrice seguente.
Il punto trasformato è:
- P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΘ) – *py*tanΘ
o in modo equivalente:
- P' = (*x* + (*y* – *py*)tanΘ, *y* + (*x* – *px*)tanΘ)
Per vedere il funzionamento di questa trasformazione, prendere in considerazione ogni componente singolarmente. Il parametro Θ sposta ogni punto nella direzione x di un importo uguale a tanΘ. Il diagramma seguente mostra la relazione tra Θ e l'asimmetria dell'asse x.
Ecco la stessa asimmetria applicata a un rettangolo:
Il parametro CL ha lo stesso effetto, ma lungo l'asse y:
Il diagramma seguente mostra l'asimmetria dell'asse y applicata a un rettangolo.
Infine, i parametri px e py spostare il punto centrale per l'asimmetria lungo gli assi x e y.
Rappresentazione di trasformazioni in Direct2D
Tutte le trasformazioni Direct2D sono trasformazioni affine. Direct2D non supporta trasformazioni non affine. Le trasformazioni sono rappresentate dalla struttura D2D1_MATRIX_3X2_F. Questa struttura definisce una matrice di 3 × 2. Poiché la terza colonna di una trasformazione affine è sempre la stessa ([0, 0, 1]) e poiché Direct2D non supporta trasformazioni non affine, non è necessario specificare l'intera matrice 3 × 3. Internamente, Direct2D usa 3 matrici × 3 per calcolare le trasformazioni.
I membri del D2D1_MATRIX_3X2_F vengono denominati in base alla posizione di indice: il membro _11 è elemento (1,1), il membro _12 è elemento (1,2) e così via. Sebbene sia possibile inizializzare direttamente i membri della struttura, è consigliabile usare la classe D2D1::Matrix3x2F. Questa classe eredita D2D1_MATRIX_3X2_F e fornisce metodi helper per la creazione di una delle trasformazioni affine di base. La classe definisce anche operator*() per la composizione di due o più trasformazioni, come descritto in Applicazione di trasformazioni in Direct2D.
Prossimo