Realizzare un ciclo per ottenere la simmetria radiale
Nella precedente lezione hai creato il nucleo e soprattutto una delle 12 colonnine. In questa lezione utilizzerai una ripetizione per creare facilmente 12 colonnine e posizionarle con una simmetria radiale.
Le ripetizioni nella programmazione
Attualmente il tuo codice consiste in queste istruzioni:
Ed arrivano a questo risultato:
Devi ottenere un risultato come questo:
Nella scorsa lezione hai visto che tra una colonnina e la successiva c’è una rotazione che incrementa sempre di 30°.
Quindi ogni colonnina differisce da un’altra solo per l’angolo di rotazione attorno al centro del rosone, definito nel blocco “Ruota intorno l’asse z. Un metodo non consigliato per creare le 12 colonnine disposte a raggiera è quello di replicare per ogni colonnina la procedura che hai visto nella scorsa lezione. Ad esempio, arriveresti a creare una sequenza di istruzioni come questa:
Per esigenze grafiche di spazio abbiamo eliminato circa la metà del codice, quello che va dalla colonnina con angolo 180° fino a quella a 360°. Quindi altre 24 blocchi oltre a quelli che vedi. E questo solo per le colonnine. Dovresti fare la stessa cosa anche per gli archetti.
Risulterebbe un’attività noiosa, ripetitiva e inefficente. E immagina quanti blocchi possano essere necessari per rosoni più complessi o con più elementi.
Questo esempio, rappresentante il rosone centrale dalla facciata della Cattedrale di San Sabino a Bari, è caratterizzata dalla disposizione di 60 elementi sferici sulla cornice del rosone. Avresti bisogno di 180 blocchi solo per posizionare questo semplicissimo elemento decorativo.
In questa lezione si introdurrà il concetto di ciclo, per imparare a ripetere un’istruzione o una sequenza di istruzioni in modo più efficiente, quindi senza dover riscrivere le istruzioni, ovvero senza dover inserire copie identiche di blocchi.
Creare un ciclo per posizionare le 12 colonnine con una simmetria radiale
La ripetizione – o ciclo – consiste nel ripetere un’istruzione o una sequenza di istruzioni. Con Codeblocks questo viene realizzato dal blocco “conta”. La ripetizione è un potente concetto della programmazione (e del pensiero computazionale).
Dal punto di vista geometrico, dovrai applicare una simmetria radiale. Per creare una ripetizione e posizionare le 12 colonnine hai bisogno di un blocco che esegua un ciclo.
Vai sulla Libreria Blocchi e seleziona l’istruzione “conta”. L’istruzione è sotto la categoria Controlla ed è rappresentata da questo blocco:
Se hai esperienza con Scratch o nella programmazione, il ciclo è sicuramente un concetto familiare. Il ciclo serve ad eseguire diverse volte uno o più blocchi di istruzioni. Queste istruzioni sono collocate all’interno del blocco del ciclo. Come puoi vedere, la parte interna del blocco presenta due agganci e uno spazio vuoto, che può essere riempito con una o due istruzioni.
Quante volte vengono eseguite queste istruzioni? Osserva il blocco con le variabili di default:
In questo caso, le istruzioni vengono eseguite 10 volte, poiché si conta da 1 a 10 facendo ogni volta un passaggio di 1 unità. Nell’immagine di sotto il ciclo viene eseguito 5 volte, perché si conta da 1 a 10 ma ogni volta ci si sposta da 2 unità.
La i è una variabile. Vedrai tra poco come utilizzarla. Intanto crea il tuo ciclo.
Posiziona il blocco “conta” nell’area di lavoro. Fai in modo che le 3 istruzioni che generano e modificano la colonnina siano inserite all’interno del ciclo. In questo modo creerai un ciclo che permette di generare 12 colonnine.
Starai pensando che per posizionare le 12 colonnine, hai bisogno di contare da 1 a 12, spostandoti di 1 unità.
Prova questa soluzione con Anteprima 3D e osserva attentamente: vedrai che verranno create 12 colonnine, ma tutte poste nella stessa posizione. Qual è il problema?
Il blocco conta ripete per 12 volte il tuo blocco di istruzioni, quindi crea 12 colonnine tutte con angolo di rotazione z=30° attorno al centro del rosone. Se modifichi manualmente l’angolo, ad esempio inserendo 60 al posto di 30, il risultato sarà lo stesso: tutte le colonnine saranno poste a 60°. Invece hai bisogno che ad ogni passaggio venga modificato l’angolo di rotazione!
Per risolvere questo problema, hai bisogno di capire come funziona la variabile presente nel blocco “conta”.
Nota bene Come già detto, per creare il solido completo nell’Anteprima 3D senza dover premere di continuo il tasto Avanti (o la barra spaziatrice della tastiera), puoi cliccare sul tasto Play. Quando hai a che fare con un ciclo ti consiglio di usare il tasto play, impostando la barra della velocità al massimo, quindi spostata tutta verso sinistra. In questo modo l’animazione sarà molto rapida. Potrai comunque usare il tasto Avanti per attività di debugging. |
Usare la “variabile contatore”
Come detto, la i è una variabile. Il termine variabile indica un oggetto che può variare nel tempo. Nel ciclo conta, la i assume un valore diverso ad ogni passaggio. Come primo valore assume quello di partenza, cioè il numero che inserisci nel campo “da”. Osserva questo esempio:
Il valore iniziale è di 1, quindi la i nel primo passaggio ha valore 1.
In ogni altro passaggio, la i incrementa del valore definito nel terzo campo, quello dell’ammontare di un passaggio. Osservando l’ultimo esempio, nel secondo passaggio esso assume il valore di 3, perché i = i+2 = 1+2. Da questo punto in poi, la i non vale più 1, ma è impostata a 3, fino a quando non arriverà il prossimo ciclo.
Nel terzo passaggio la i ammonta a 5, perché i = i+2 = 3+2. Infine assume il valore di 7 al quarto e di 9 al quinto.
La variabile i è quindi un oggetto dove memorizzare un valore che deve cambiare in ogni passaggio. Puoi recuperare la variabile i dalla Libreria Blocchi, sotto la categoria Dati. Troverai un blocchetto circolare celeste con il nome della variabile:
Fai una prova: inserisci il blocco della variabile i all’interno del campo che indica i gradi nella rotazione attorno al centro del rosone.
Visualizza l’Anteprima 3D e osserva attentamente l’esecuzione: qualcosa è cambiato! Le colonnine si sono solo collocate in posizioni differenti, anche se con un angolo talmente piccolo che sono tutte attaccate tra loro.
Il motivo è semplice: con le tue istruzioni fai ruotare ogni colonnina di 1° rispetto all’altra, in quanto la i assume 1 nella prima ripetizione, 2 nella seconda ripetizione, e così via.
Per ruotare correttamente le copie delle colonnine devi inserire il dato mancante: l’angolo di rotazione corretto. Per ogni passaggio, hai bisogno di ruotare ogni volta di 30 gradi ulteriori, come già visto. Quindi hai bisogno che ad ogni passaggio, la i assuma il valore dell’angolo di riferimento.
Prova a scrivere il tuo codice per posizionare le colonnine con il giusto angolo.
Prenditi qualche minuto, e poi clicca su “Verifica il risultato” puoi visualizzare il codice corretto. Se invece vuoi andare direttamente alla spiegazione, clicca subito su Verifica il risultato.
Devi inserire un ciclo conta che parta da 30, arrivi a 360, e faccia passaggi di 30. Se hai inserito i valori 0 – 330 – 30 otterrai un risultato equivalente ed ugualmente corretto.
Dal punto di vista geometrico, questi valori coincidono esattamente con quanto avevi già definito in fase di definizione dell’algoritmo. Avevi visto che le colonnine partono da un angolo, si muovono di 30° e arrivano fino all’angolo giro.
Guarda cosa succede alla
- nel primo passaggio del ciclo, ammonta a 30, il valore da cui parte il conteggio,
- nel secondo passaggio del ciclo, ammonta a 60° (perché i=i+30, quindi i=30+30=60),
- nel terzo passaggio del ciclo, ammonta a 90° (i=i+30, ma nel passaggio precedente la i ha assunto il valore 60, quindi i=60+30=90)
- nel quarto passaggio del ciclo, ammonta a 120°, e così via,
fino ad arrivare a 360° (angolo giro), cioè fino ad aver fatto un giro completo.
Tutto questo è ben descritto nella parte iniziale del blocco conta, dove hai scritto che bisogna contare a 30 a 360, facendo ogni volta un passo da 30.
In sintesi, con queste istruzioni hai programmato un ciclo in cui ogni volta crei un cilindro che ruota, in ogni passaggio, di i+30°. Perché non partire da 0° e arrivare a 360°? Perché in geometria questi due angoli sono lo stesso! Quindi avresti creato una 13 esima colonnina, sovrapposta alla prima.
Guarda cosa sarebbe successo alla
- 0: colonnina 1
- 30: colonnina 2
- 60: colonnina 3
- 90: colonnina 4
- 120: colonnina 5
- 150: colonnina 6
- 180: colonnina 7
- 210: colonnina 8
- 240: colonnina 9
- 270: colonnina 10
- 300: colonnina 11
- 330: colonnina 12
- 360: ???
Noterai che c’è un passaggio extra. Come detto, una soluzione che preveda la partenza da 0 e arrivo a 330 è equivalente ed ugualmente corretta.
Se hai realizzato una sequenza corretta, vedrai le 12 colonnine posizionate in maniera corretta. Sei riuscito a fare questa operazione con un paio di blocchi anziché i 50 blocchi della soluzione senza ripetitozione. Inoltre realizzare un risultato del genere con la modellazione manuale su Tinkercad avrebbe richiesto molto tempo e accuratezza nel disegno. Con questa attività hai potuto appurare appieno le potenzialità del coding 3D.
Nota bene Se non conosci il concetto di ciclo o ripetizione, puoi approfondire questo concetto tramite queste risorse: https://programmailfuturo.it/come/primaria/vecchie-lezioni-tecnologiche/corso-2/lezione-8 per la scuola primaria, a http://www.codeweek.it/cody-roby/energia/ nella versione unplugged, a https://www.youtube.com/watch?v=5tpX3LxGs-U per i cicli con Scratch |
Passa alla prossima lezione per inserire gli archetti e completare la versione semplificata del rosone!