<< Chapter < Page | Chapter >> Page > |
Nella computer grafica interattiva, punti e vettori sono rappresentati in coordinate omogenee mediante array di quattro elementi, e tutte le trasformazioni geometriche (traslazioni, rotazioni, scalamenti, proiezioni) sono realizzate con prodotti matrice-vettore.
int DIM = 4;
float[][] myMatrix = {{0, 1, 0, 0},
{1, 0, 0, 0},
{0, 0, 0, 1},
{0, 0, 1, 0}
};
float[] myVector = {0.1, 0.2, 0.3, 0.4};
float[] newVector = new float[4];
for (int i=0; i<DIM; i++)
for (int j=0; j<DIM; j++)
newVector[i] += myMatrix[i][j] * myVector[j];
println(myVector); println();
println(newVector);
Come è fatta la matrice che, pre-moltiplicata per un array, ne ruota circolarmente di una posizione gli elementi?
Una matrice fatta così è un caso particolare di matrice circolante .
In molte applicazioni di interaction design (si veda, ad esempio, il caso della interactive sonification ), ci si trova a dover mappare una molteplicità di variabili, il cui valore può venire dallalettura di sensori, in una molteplicità di parametri algoritmici. Spesso tale mapping è lineare ed esprimibilecon un prodotto matrice-vettore. Ad esempio, distanza, velocità, e temperatura si possono mappare in posizione, colore, e frequenza di oscillazione di un oggetto grafico, in maniera che, ad esempio, il colore dipenda da una combinazione divelocità e temperatura. Il funzionamento delle Mixing Console si può interpretare come mapping multivariato lineare degli ingressi nelle uscite.Purtroppo, molti mapping di interesse sono non-lineari, e non esprimibili mediante prodotto matrice-vettore. Adesempio, la trasformazione delle coordinate di rappresentazione dei colori da RGB a HSB è non lineare.
Gli array soffrono di due limitazioni principali:
Nel progetto
WAV ,
la classe
Matrix per l'ambiente
Wiring di
physical computing è
stata usata per pilotare una matrice di LED a 8 righe e 16colonne per mezzo di un paio di chip
MAXIM
MAX7219 .
Supponiamo per semplicità di dover gestire una matrice a 8 righee 8 colonne per mezzo di un solo chip MAX7219 e di voler
propagare una cresta d'onda da sinistra a destra. La matriceviene dichiarata e istanziata come
Matrix myMatrix = Matrix(0, 2, 1);
Si può
predisporre un array bidimensionale di bit 8x8 medianteistanziazione della classe
Sprite :
Sprite wave = Sprite(
8, 8,b10000000,
b10000000,b01000010,
b01000010,b00100100,
b00100100,b00011000,
b00011000,);
e scrivere una funzione da eseguirsi a clockrate
void loop()
{myMatrix.write(i, 1, wave); // place sprite on screen (i is an int)
delay(1000); // wait a little bitmyMatrix.clear(); // clear the screen for next animation framei = 1 + (i+1)%8; // circular (between 1 and 8) increment of i
}
oppure, alternativamente, procedere direttamente alla scrittura ciclica
void loop()
{myMatrix.clear(); // clear displaydelay(1000);// turn pixels on (i is an int that is forced to stay between 0 and 7)
// decreasing rampmyMatrix.write(1, 1+(i)%8, HIGH);
myMatrix.write(2, 1+(i)%8, HIGH);myMatrix.write(3, 1+(i+1)%8, HIGH);
myMatrix.write(4, 1+(i+1)%8, HIGH);myMatrix.write(5, 1+(i+2)%8, HIGH);
myMatrix.write(6, 1+(i+2)%8, HIGH);myMatrix.write(7, 1+(i+3)%8, HIGH);
myMatrix.write(8, 1+(i+3)%8, HIGH);// increasing ramp
myMatrix.write(3, 1+(i+6)%8, HIGH);myMatrix.write(4, 1+(i+6)%8, HIGH);
myMatrix.write(5, 1+(i+5)%8, HIGH);myMatrix.write(6, 1+(i+5)%8, HIGH);
myMatrix.write(7, 1+(i+4)%8, HIGH);myMatrix.write(8, 1+(i+4)%8, HIGH);
i++;}
Notification Switch
Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?