Nell'esercizio precedente, abbiamo interagito con un'immagine digitalizzata, agendo sui singoli pixel.

L'interazione era "manuale", nel senso che era basata su alcune nostre capacità sensoriali e motorie particolari, caratteristiche di noi "umani": "vedere" il pixel che vogliamo invertire, "muovere" il mouse, che sposta il puntatore, fino a finirci sopra, "cliccare". Questo è il modo con cui quotidianamente interagiamo con la realtà (es: apriamo la porta girando la maniglia, accendiamo la luce premendo l'interruttore, etc).

Ed eccoci ad una delle ragioni più interessanti per le quali è utile imparare a "programmare" i computer al giorno d'oggi: sempre più oggetti, o pezzi di realtà, fisica o virtuale che sia, offrono un canale di interazione di tipo diverso, speciale, pensato per essere acceduto da un computer, invece che da un umano. Se impariamo a programmare un computer, guadagniamo accesso ad un'altra porta, per interagire con la realtà, attraverso la quale è possibile fare cose altrimenti impossibili!

Per vedere di che si tratta, torniamo ai nostri pixel in bianco e nero, e vediamo subito un esempio di questo nuovo canale di interazione.

Ora invece di cliccare sui pixel, possiamo interagire con l'immagine scrivendo dei "comandi" testuali in una casella sotto l'immagine e, successivamente, "eseguendoli".

I comandi che consideriamo hanno questa struttura generale:

nome_oggetto.comando(parametri)

Il punto (.) separa l'oggetto sul quale vogliamo agire dall'azione che vogliamo compiere.


Nota tecnico/"linguistica"
: i linguaggi che prevedono questa particolare forma di comandi, in cui vengono specificati un oggetto e l'azione che si vuole eseguire su di esso, sono detti "orientati agli oggetti".

Esempi "famosi" di linguaggi orientati agli oggetti sono Java, C++, Javascript, Python.


Nel nostro caso, l'oggetto su cui vogliamo agire è l'immagine, che abbiamo chiamato, arbitrariamente, "img"

L'azione, invece, è specificata da due informazioni: il nome di un comando, ed eventualmente il valore di alcuni parametri.

Perché servono queste informazioni? Andiamo a vedere quali sono i comandi disponibili per interagire con le nostre immagini, e tutto sarà più chiaro!

I comandi disponibili sono:

nome_oggetto.selectPixel(x,y): "seleziona" il pixel alla colonna x, riga y, cioè posiziona un "pennello virtuale" sopra quel pixel

nome_oggetto.setPixel(colore): "dipinge" il pixel sul quale si trova il "pennello virtuale" del colore colore (1: bianco, 0: nero)

Siccome l'oggetto sul quale agire si chiama "img", un esempio di comando che useremo sarà:

img.selectPixel(2,2)

Cosa farà questo comando? Selezionerà il pixel in posizione (2,2) (terza riga, terza colonna). Per visualizzare l'effetto dell'azione possiamo immaginare che un pennello virtuale venga posizionato sopra la posizione (2,2).

Partiamo da un esempio semplice: consideriamo lo smiley digitale dell'esercizio precedente.

Ti propongo un esercizio, per impratichirti con l'uso del nuovo canale: annerisci il pixel in alto a sinistra dello smiley...

Scrivi nel box un comando per volta seguito da Esegui. Se per caso sbagli comando, premi Reset e ricomincia dall'inizio.

Attenzione: i comandi devono essere sintatticamente precisi! Se non usi le maiuscole nel modo corretto o sbagli l'ortografia (es. imc invece di img, o , invece di .), l'interprete dei comandi ti segnalerà in rosso un errore. Non spaventarti! E' del tutto normale sbagliare, anche per i migliori programmatori! Cerca di capire dove hai sbagliato, correggi, e vai avanti...

Clicca Coding-mooc Polimi per accedere all'esercizio.

Avrai notato che i parametri che passi a selectPixel indicano la riga e la colonna dell'immagine, invece dell'ascissa e ordinata in un piano cartesiano. Se la cosa ti sembra strana, non preoccuparti: sono solo convenzioni, l'importante è capirsi! In particolare, in questo caso, noi abbiamo usato una convenzione simile a quella con cui si legge un testo: partendo dall'alto a sinistra, andando verso il basso a destra....

Inoltre, avrai notato come per indicare il primo elemento di qualcosa si usi lo 0, invece del forse più intuitivo 1. Questa è una convenzione diffusa nell'informatica, ed ha questa origine: gli elementi, all'interno di una sequenza, vengono individuati in base alla loro distanza dal primo: così il primo è individuato da 0 (perché è a distanza nulla da sé stesso), il secondo è a distanza 1 dal primo etc.

Riflettiamo un attimo su quello che hai appena fatto: hai descritto, in forma testuale, come modificare un'immagine, seppure in modo molto semplice. La descrizione che hai prodotto è "non ambigua": qualsiasi computer che sia in grado di interpretarla la eseguirà alla stessa maniera. Inoltre è completamente testuale, e quindi facilmente digitalizzabile. In gergo, una descrizione come questa si chiama informalmente "codice".

Il fatto che il codice sia testuale, e quindi facilmente digitalizzabile, ha molte implicazioni. La più semplice e ovvia è che lo puoi trasmettere.

Una delle più profonde l'ha evidenziata Alan Turing, un brillantissimo matematico considerato a ragione uno dei padri dell'informatica. Con un po' di spensierata improprietà la potremmo descrivere così: non tutto ciò che è vero è dimostrabile! Se la cosa ti incuriosisce, abbi un po' di pazienza: riprenderemo la questione alla fine del corso...