DirectX/Calcolo matriciale
Una matrice è una tabella rettangolare di numeri reali. Ogni matrice è composta da m righe e n colonne. Ogni elemento nella matrice occupa una determinata posizione (i,j). Il numero degli elementi della matrice si ottiene moltiplicando m per n. Per trovare un oggetto nella matrice lo identifichiamo con la coppia di coordinate. L'elemento alla posizione (i,j) della matrice M sarà Mi,j, dove i è la riga, e j la colonna.
Ecco alcuni esempi di matrici:
Mentre A è una matrice generica, B è una matrice speciale e viene detta quadrata, ossia quando m = n. Anche C e D hanno particolarità: per C, m = 1, e viene detto vettore (o matrice) riga, D invece ha n = 1 ed è detto vettore/matrice colonna.
Operazioni tra matrici
modificaLe operazioni tra matrici sono molto simili a quelle tra vettori:
- Uguaglianza: due matrici sono uguali se per ogni elemento (i,j) della prima matrice, l'elemento (i,j) della seconda matrice ha lo stesso valore:
L'uguaglianza può essere verificata solo per due matrici con lo stesso numero di righe e colonne.
- Somma: la somma si esegue elemento per elemento. Può essere calcolata solo per matrici con lo stesso numero di righe e colonne. Il risultato della somma tra due matrici è quindi una terza matrice in cui ogni elemento è la somma degli elementi nella stessa posizione delle matrici originarie:
- Prodotto per scalare': come per i vettori, il prodotto tra una matrice ed uno scalare è una matrice in cui tutti gli elementi sono stati moltiplicati per lo scalare.
- Sottrazione: come per i vettori, viene definita in termini di addizione e prodotto per scalare. In particolare date M ed N matrici, M - N = M + (-1N).
Prodotto tra matrici
modificaQuesta operazione non ha simili tra i vettori ed è molto complessa. Può essere eseguita solo se il numero di colonne della prima matrice è uguale a quello delle righe della seconda. Date due matrici M ed N, il loro prodotto sarà una terza matrice in cui ogni elemento (i, j) è il prodotto scalare (vedi i vettori) tra il vettore riga i della matrice M ed il vettore colonna j della seconda matrice. Esempio:
Il prodotto AB è definito dato che A ha un numero di colonne pari al numero di righe di B. Si calcola in questo modo:
Questa operazione gode della proprietà associativa ma non commutativa. Quindi . Ma
Prodotto tra vettore e matrice
modificaIl prodotto tra vettore e matrice è possibile solo quando il numero di elementi nel vettore è uguale al numero di righe della matrice. Il prodotto tra vettore e matrice è un vettore di tanti elementi quanti nel primo vettore. Dato un vettore di n elementi, il vettore risultante sarà la somma di n vettori tali che: il primo vettore è il prodotto tra il valore scalare alla posizione 1 del vettore ed il vettore riga n. 1 della matrice, il secondo è il prodotto tra l'elemento del vettore alla posizione 2 e il vettore riga n. 2 della matrice. In altre parole: dove indica il vettore riga numero n.
Matrici particolari
modificaMatrice identità
modificaLa matrice identità è la matrice che moltiplicata per qualsiasi altra matrice (dove la moltiplicazione è applicabile) la lascia inalterata. La matrice identità è sempre quadrata ed è composta da tutti zeri tranne la diagonale che va da (0, 0) a (n, n), dove n è il numero di righe e colonne della matrice stessa, che sarà invece riempita di 1. Sono matrici identità:
Per qualsiasi matrice identità I vale: e
Matrice trasposta
modificaLa trasposta di una data matrice è una seconda matrice dove sono invertite colonne e righe:
Matrice inversa
modificaSi definisce matrice inversa di una matrice M, una matrice M-1 tale che . Il calcolo della matrice inversa non è semplice e per quanto ci serve nemmeno utile. Esiste comunque una funzione di D3DX che ci permette di calcolare la matrice inversa di una data matrice.
DirectX e le Matrici =
modificaUna matrice in DirectX si può definire come di tipo D3DXMATRIX. In DirectX tutte le matrici sono sempre quadrate di lato 4. In altre parole ogni D3DXMATRIX ha sempre 4 righe e 4 colonne. La classe D3DXMATRIX è molto completa e fornisce operatori di uguaglianza, somma sottrazione, moltiplicazione per costante e per altra matrice. Ci sono inoltre 4 funzioni che svolgono altri compiti:
D3DXMATRIX *D3DXMatrixIdentity(D3DXMATRIX *pOut);
D3DXMATRIX *D3DXMatrixTranspose(D3DXMATRIX *pOut, D3DXMATRIX *pM);
D3DXMATRIX *D3DXMatrixInverse(D3DXMATRIX *pOut, float *pDeterminant, D3DXMATRIX *pM);
D3DXVECTOR4 *D3DXVec4Transform(D3DXVECTOR4 *pOut, D3DXVECTOR4 *pV, D3DXMATRIX *pM);
- D3DXMatrixIdentity prende un puntatore a matrice come argomento e trasforma quella matrice nella matrice identità.
- D3DXMatrixTranspose genera la matrice trasposta di una data matrice M. Come primo parametro vuole il puntatore alla matrice dove verrà messo il risultato e come secondo, la matrice originale.
- D3DXMatrixInverse genera la matrice inversa di una data matrice M. Funziona come Transpose.
- D3DXVec4Transfor moltiplica un vettore per una matrice ottenendo un nuovo vettore. Come argomenti vuole il puntatore al vettore risultato, il vettore da moltiplicare e la matrice da moltiplicare.
Terminato il modulo sulle matrici non posso che suggerire di allenarsi su fogli di carta o scrivere piccoli programmi per fissare questi concetti fondamentali per la computer graphics.