Indice    Avanti    Indietro




11. La gestione dei colori
         Istruzioni esaminate: setpc, setfc, setsc, fill, pu, pd, random, setpensize


Nel numero 7 abbiamo visto come si possa cambiare il colore della traccia lasciata dalla tartaruga mediante un'opzione del menu "Set" della finestra principale. Ma in molte occasioni dovremo poter gestire i colori mediante istruzioni poste all'interno delle nostre procedure.

L'MSWLogo è in grado di gestire un numero di colori pari a 2563=16777216. Ogni colore viene individuato mediante una lista di tre numeri interi: il primo numero della lista è la componente rossa, il secondo la componente verde, il terzo la componente blu. Ciascuna componente può variare tra 0 e 255. La procedura seguente, ad esempio, traccia un quadrato in rosso.

to Quadrato 
   setpc [255 0 0] 
   repeat 4 [fd 100 rt 90]
end

L'istruzione setpc (set pen color) imposta il colore della traccia lasciata dalla tartaruga; in questo caso il primo numero della lista in input è il valore massimo 255 (componente rossa), mentre gli altri due valori sono nulli (componente verde e blu). Ecco perché la traccia sarà rossa (rosso puro, componente rossa al 100%). Se il primo valore fosse più basso, ad esempio 200, avremmo un rosso più scuro. L'istruzione setpc [0 255 0] imposterebbe invece il verde puro (solo componente verde al 100%) e l'istruzione setpc [0 0 255] il blu puro (solo componente blu al 100%). Naturalmente potremo mescolare le tre componenti in diverse percentuali ottenendo tutti i colori possibili; ecco ad esempio delle terne di valori con i relativi colori:

[0 0 0], nero
[255 255 255], bianco
[255 0 0], rosso
[0 255 0], verde
[0 0 255], blu
[0 0 140], blu scuro
[255 255 0], giallo
[0 255 255], azzurro
[255 0 255], viola
[162 123 91], marrone
[255 128 0], arancione
[128 128 128], grigio
Provate a definire qualche colore: avete a disposizione 256 scelte per ogni componente, per un totale di 2563 colori !

Esaminate ora questa procedura che contiene alcune nuove istruzioni
to QuadratoColorato
   cs ht
   setpc [0 0 0]
   setfc [255 128 0]
   repeat 4 [fd 100 rt 90]
   pu
      rt 45
      fd 5
      fill
   pd
end

La schermata seguente ne mostra l'effetto.

Qui oltre all'istruzione setpc è presente anche l'istruzione setfc (set flood color) che imposta il colore del riempimento delle figure. Nel nostro caso il colore della traccia è nero (contorno della figura) mentre il riempimento è arancione.

Ma come abbiamo fatto a "riempire" la figura con un colore? E' molto semplice: dobbiamo portare la tartaruga in un punto qualsiasi che sia interno alla figura e poi dare l'istruzione fill (riempi). Attenzione però, la tartaruga deve arrivare all'interno della figura senza lasciare la traccia. A questo scopo abbiamo utilizzato l'istruzione pu (pen up, penna su) che impedisce alla tartaruga di lasciare la traccia durante i suoi spostamenti. L'istruzione pd (pen down, penna giù) rimette poi le cose a posto, ripristinando la traccia. Allora il frammento della procedura precedente

pu
   rt 45
   fd 5
   fill
pd

ha lo scopo di portare la tartaruga all'interno del quadrato (con la penna su) e di riempire la figura.

Un'altra istruzione per la gestione dei colori che potrà farci comodo è setsc (set screen color): serve a impostare il colore dello sfondo. Anche setsc, come setpc e setfc, deve ricevere in input una lista di tre numeri (le tre componenti del colore). Per cambiare lo spessore del tratto lasciato dalla tartaruga utilizzeremo l'istruzione setpensize che riceve in input una lista di due numeri, ad esempio setpensize [5 5].

Affrontiamo un'ultima questione. Vogliamo poter utilizzare dei colori le cui componenti siano variabili. Considerate ad esempio la procedura seguente che crea 30 bande di colori generati a caso (ad ogni avvio della procedura vengono generati nuovi colori)

to colori
   cs ht
   pu lt 90 fd 150 rt 90 pd
   repeat 30 ~
      [make "rosso random 256
      make "verde random 256
      make "blu random 256
      setpc (list :rosso :verde :blu)
      repeat 10 [fd 100 bk 100 rt 90 fd 1 lt 90]]
end

Ne vedete l'effetto nella schermata seguente.

Cerchiamo in primo luogo di capire il ruolo dell'importante istruzione random; nel nostro caso l'istruzione random 256 genera un numero intero casuale maggiore o uguale a 0 e minore di 256. Cos'è un numero casuale? Potete immaginare che in un sacchetto siano presenti 256 dischetti numerati da 0 a 255: ogni volta che viene chiamata l'istruzione random 256 viene estratto un numero a caso (e poi il dischetto rimesso nel sacchetto). Allora le tre variabili rosso, verde, blu, che rappresentano le componenti del colore che utilizzeremo, vengono ridefinite per 30 volte e ogni volta ad esse viene assegnato un valore casuale tra 0 e 255.

C'è poi un altro aspetto importante. Come facciamo a costruire la lista dei tre valori che definiscono un colore a partire dalle tre variabili? Dobbiamo utilizzare l'istruzione list che ha proprio lo scopo di generare una lista. Attenzione alla sua sintassi (e alle parentesi)

(list :rosso :verde :blu)

Come vedete l'istruzione list ha in input tre valori (ma potrebbe averne due o più di tre) e fornisce in output la lista dei tre valori. Potrà sembrare una complicazione ma per il Logo le liste sono delle strutture ben precise, una sorta di "pacchetto" di dati, e devono essere manipolate con delle istruzioni apposite. Le liste in Logo sono individuate dalle parentesi quadre; ad esempio

[21 93 123]

è una lista e va considerata come un unico dato. Allora

setpc [21 93 123]

è un'istruzione corretta mentre non lo è

setpc 21 93 123

Noi abbiamo incontrato spesso delle liste: è una lista, ad esempio, il blocco di istruzioni presente nell'istruzione repeat. Le liste costituiscono un argomento avanzato della programmazione in Logo e consentono una grande flessibilità nella gestione dei dati. Osservate questa procedura

to quadrato
   make "BLOCCO [fd 100 rt 90]
   repeat 4 :BLOCCO
end

Qui la variabile BLOCCO non rappresenta un dato numerico ma un frammento del programma stesso.