<< Chapter < Page | Chapter >> Page > |
Un array è una lista numerata di valori,
tutti dello stesso tipo (
int
,
float
,
ecc.). La numerazione, in Processing (e Java), parte da zero. Ladichiarazione e creazione di un array avviene in maniera uguale
a quella di un oggetto istanza di classe.Ad esempio
float[] vettore = new float[100];
println(vettore);
crea un array di 100 elementi di tipo
float
e ne stampa il contenuto, che è inizialmente costituito da zeri.
L'array così dichiarato è a tutti gli effetti un oggetto istanzadi classe, e tale classe ha anche una variabile
length
, che ne contiene la lunghezza. Quindi, per
inizializzare l'array come una rampa lineare che va da 0 a 1, sipuò fare
for (int i = 0; i < vettore.length; i++)
vettore[i] = (float)i/vettore.length;
println(vettore);
(float)
e si spieghi perché la rampa non viene più
generata.Un
MIDI
controller continuo, come uno slider, può inviare valori
tra 0 e 127, che possono essere usati come indici per leggere ivalori di una certa proprietà. Un array può servire a mappare un controllo
in un valore di proprietà. La relazione tra controllo(indice) e proprietà è una mappa uno a uno.
Nel codice che segue, la mappa è costruita muovendo sopra allafinestra il mouse con tasto premuto. Invece, se il mouse viene
spostato senza essere premuto, la posizione orizzontale delpuntatore (tra 0 e 127) viene interpretata come indice della
mappa, che restituisce il valore della proprietà di brillantezzadello sfondo.
int ris = 128;
int[] midimap = new int[128];
void setup() {
size(ris,2*ris);
}
void draw() {
background(255);
if ((mouseX >= 0) && (mouseX < ris))
if (!mousePressed)
background((256 - midimap[mouseX]));
else
midimap[mouseX] = mouseY;
for (int i=0; i<midimap.length; i++) point(i, midimap[i]);
}
Come si possono evitare i "buchi" nella mappa dovuti alla lettura non continua delle posizioni del mouse?
int sup_ris = 256;
int inf_ris = 128;
float[] midimap = new float[sup_ris];
void setup() {
size(inf_ris,inf_ris);
colorMode(RGB, 1.0);
for (int i = 0; i < midimap.length; i++) midimap[i] = sin(PI*(float)i/midimap.length);
}
void draw() {
if ((mouseX >= 0) && (mouseX < inf_ris) && (mousePressed))
{
point(mouseX, inf_ris - inf_ris*midimap[sup_ris/inf_ris*mouseX]);
}
}
int inf_ris = 128;
int sup_ris = 1024;
float[] midimap = new float[inf_ris];
void setup() {
size(sup_ris,32);
colorMode(RGB, 1.0);
for (int i = 0; i < midimap.length; i++) midimap[i] = sin(PI*(float)i/midimap.length);
}
void draw() {
if ((mouseX >= 0) && (mouseX < sup_ris) && (mousePressed))
background(midimap[int(float(mouseX)/sup_ris*inf_ris)]);
}
Come posso accedere alla tabella sfruttando per quanto possibile
l'accuratezza dei 10 bit? Si può fare una
interpolazione lineare . Il beneficio
dell'interpolazione diventa molto evidente nel passaggio da 10 a3 bit, cioè ponendo
inf_ris = 8
. Con
l'interpolazione lineare, il metodo
draw()
va così
riscritto:
void draw() {
if ((mouseX >= 0) && (mouseX < sup_ris) && (mousePressed))
{
int flo = floor(float(mouseX)/sup_ris*inf_ris);
float alpha = float(mouseX)/sup_ris*inf_ris - float(flo);
background((1-alpha)*midimap[flo] + alpha*midimap[(flo+1)%midimap.length]);
}
}
alpha
è il resto del troncamento a
bit
dell'indice di
bit, e viene usato per pesare due elementi
contigui dell'array a
inf_res
elementi. Quale è la funzione
dell'operazione di modulo
%midimap.length
?
Notification Switch
Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?