<< Chapter < Page Chapter >> Page >
Utilizzazione di array mono- e bi-dimensionali nella realizzazione di mappe per il controllo dell'interazione.

Array

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);

Si provi a togliere il typecasting (float) e si spieghi perché la rampa non viene più generata.

1-to-1 mapping

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?

Estensione di risoluzione

Ho un controllore MIDI (a 128 valori) e voglio scandire una tabella di256 valori. Si può iterare la lettura avanzando il punto di lettura con passo 2. 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]); } }

Riduzione di risoluzione

Ho un controllore a 10 bit (1024 valori) e devo mapparlo in unaproprietà secondo una tabella di 128 valori che descrivono un semiperiodo di seno. 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 2 logbase --> inf_res bit dell'indice di 2 logbase --> sup_res bit, e viene usato per pesare due elementi contigui dell'array a inf_res elementi. Quale è la funzione dell'operazione di modulo %midimap.length ?

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Programmazione di artefatti interattivi. OpenStax CNX. Dec 09, 2010 Download for free at http://cnx.org/content/col10417/1.9
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Programmazione di artefatti interattivi' conversation and receive update notifications?

Ask