DirectX/Calcolo matriciale

Indice del libro

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

modifica

Le 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

modifica

Questa 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

modifica

Il 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

modifica

Matrice identità

modifica

La 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

modifica

La trasposta di una data matrice è una seconda matrice dove sono invertite colonne e righe:

 

Matrice inversa

modifica

Si 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 =

modifica

Una 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.