Appendice:
un programma che disegna una matrice di colori data.

Il programma che scriveremo prende un file di nome X.txt, che comprenda una matrice di colori, e disegna l'immagine corrispondente, salvandola su un file (in formato "GIF").
In questo momento è inattivo: per eseguirlo, dovete avere a disposizione una copia di Mathematica, e trasformare le parti in corsivo in comandi.

I parametri del programma sono:
- la posizione della Directory in cui intendiamo lavorare;
- Il nome del file in input;
- Il nome del file di output;
Scegliamo ora il valore di tali parametri:

WorkingDirectory = "C:/MyDocuments";
InputFile                     = "X.txt";
OutputFile                 = "AlberoDiNatale.GIF";

E' richiesto che i dati sulla matrice di colo compaiano nel file di input nella forma di un numero per riga, iniziando con le dimensioni a, b della matrice, e continuando con le proporzioni di rosso, verde e blu nei punti di coordinate (0,0), (0,1), ..., (1,0), (1,1), ...,(a-1,b-1). Ecco come appare il file di input:
    a
    b
    R(0,0)    
    G(0,0)
    B(0,0)    
    R(0,1)
    G(0,1)
    B(0,1)
    ....

Realizzazione del programma.

Fissiamo la directory di lavoro:

SetDirectory[WorkingDirectory]

Leggiamo i dati del file di input in una lista L:

L=ReadList[InputFile];

Estraiamo a, b dalla cima di L, quindi eliminiamo i primi due punti di L:

a = L[[1]]
b = L[[2]]

L = Drop[L,2];

Ora raggruppiamo i numeri di L a 3 a 3 (ogni terna così ottenuta contiene le proporzioni di rosso, verde e blu di qualche punto). Raggruppiamo ora i b vettori di colori relativi ai punti di una stessa riga nella matrice di colori. Sia L2 il risultato.

L1 =Partition[L,3];

L2 = Partition[L1,b];

Controlliamo che le dimensioni di L2 siano quelle giuste:

Dimensions[L2]

Completiamo la riorganizzazione del dato. Rimpiazziamo ogni vettore {R,G,B} con le proporzioni dei tre colori relative a un dato punto con il singolo comando RGBColor[R,G,B]. Sia RGB la funzione che trasforma il vettore {R,G,B} nel comando RGBColor[R,G,B]. Dato che i vettori {R,G,B} sono a profondita' 2 in L2 (sono dentro due livelli di parentesi graffe in L2) per raggiungere ogni {R,G,B} e trasformarlo dobbiamo usare il comando Map[RGB,L2,{2}]. Tale comando (si veda la spiegazione) applica RGB ad ogni parte di L2 di profondita' 2.

RGB[{x_,y_,z_}]:=RGBColor[x,y,z];

L3 = Map[RGB,L2,{2}];

Terminiamo generando il disegno e salvandolo sul file di output (in formato "GIF").

output=Show[Graphics[RasterArray[L3],AspectRatio->a/b, ImageSize->{b,a}]]

Display[OutputFile,output,"GIF"]


Converted by Mathematica      February 28, 2003