024 Python 3 + Turtle: Le basi del disegno.

10 Giugno, 2023 (13:01) | Python | By: sargonsei

024 Python 3 + Turtle: Le basi del disegno.

01) Cose da sapere prima di procedere.
a) Si ribadisce per l’ennesima volta che, a voler essere rigorosi, nel linguaggio Python, ciascuno dei 3 termini: FUNZIONE, METODO, e MODULO, ha un significato ben preciso ma, nel linguaggio comune (spesso usato dagli autodidatti in alternativa al linguaggio tecnico), ha un significato che non coincide esattamente con quello che ha nel linguaggio di programmazione Python. In altre parole: chi vuole essere rigoroso, si compri un libro di Python 3 scritto da un autore di sua fiducia, e si comporti per come è scritto in quel libro; io sono autodidatta, e questi sono i miei appunti, non la guida ufficiale.
A chi preferisce una guida ufficiale, si consiglia quella in inglese alla pagina web
https://docs.python.org/3/library/turtle.html
oppure anche una breve guida in italiano che elenca tutti i colori disponibili:
https://www.alfredocentinaro.it/lezioni/python/turtle/python-turtle-manuale-sintetico/

b) In questa pagina di appunti, i vocaboli che contengono lettere maiuscole sono da interpretare come variabili il cui valore deve essere impostato dall’utente, oppure come nomi impostati dall’utente. Questa è una convenzione da autodidatta, raramente condivisa dai professionisti.

c) Di default, il piano cartesiano su cui Turtle disegna non ha un nome, ma è possibile dargliene uno, utilizzando il comando
nomePianoCartesiano1 = turtle.Screen() # Creare l’oggetto nomePianoCartesiano1 su cui disegnare
È possibile utilizzare un solo piano cartesiano alla volta; la creazione di un ulteriore piano cartesiano, produce la sparizione del piano cartesiano precedente e di tutto il suo contenuto.

d) Impostare dimensioni del piano cartesiano su cui appariranno i disegni.
Se non ci va bene che in piano cartesiano sia rappresentato con le dimensioni di default, possiamo aprirlo a tutto schermo, oppure spostare i bordi tramite il puntatore del mouse, oppure utilizzare il comando [.setup(X, Y)] per impostare nuove dimensioni correnti; in quest’ultimo caso, X ed Y sono rispettivamente larghezza ed altezza del piano cartesiano visualizzato., ovvero le variabili che li contengono.
Qualunque metodo si intenda utilizzare, il punto del piano cartesiano avente coordinate [0, 0] sarà sempre al centro della porzione del piano cartesiano visualizzata.

e) L’utilizzo delle istruzioni spiegate in questa pagina di appunti, deve essere preceduto dall’istruzione per importare il modulo TURTLE. Il fatto che una istruzione specifica del modulo TURTLE venga letta prima dell’istruzione per importare il modulo TURTLE, darà luogo ad un errore di sintassi.
L’istruzione per importare il modulo TURTLE è:
import turtle # Importare il modulo TURTLE
La riga suddetta deve essere scritta una volta sola ed in una posizione tale da far sì che venga letta prima di ogni altra istruzione specifica del modulo TURTLE.

f) L’esecuzione dell’ultima istruzione del programma provoca la scomparsa del piano cartesiano utilizzato dal programma stesso; per evitarlo, occorre inserire -in coda al programma- un’istruzione che ritardi il termine dell’esecuzione del programma.
Ci sono varie istruzioni per ritardare la chiusura del piano cartesiano; seguono alcuni esempi:
turtle.mainloop() # Attendere che l’utente chiuda il piano cartesiano
turtle.exitonclick() # Chiudere il piano cartesiano cliccando su di esso.

g) Di default, non è necessario definire l’oggetto con cui si scrive, in quanto TURTLE assume che l’oggetto con cui si scrive si chiami [turtle]. Tuttavia, dare un nome all’oggetto con cui si scrive consente di creare oggetti diversi, ciascuno dei quali ha i propri parametri correnti.
L’istruzione per creare un oggetto con cui disegnare è:
nomeOggettoPerDisegnare1 = turtle.Screen() # g) Creare l’oggetto nomeOggettoPerDisegnare1 con cui disegnare
È possibile utilizzare più d’un ulteriore oggetto per disegnare alla volta; la creazione di ogni ulteriore oggetto per disegnare, produce un ulteriore oggetto per disegnare con parametri correnti propri, del tutto indipendente da ogni altro oggetto per disegnare.

h) Di default, il punto finale di ogni linea (retta o curva che sia) coincide con il punto iniziale corrente della linea tracciata successivamente, e ogni linea è raccordata alla precedente; in assenza di linee precedenti, di default il punto di inizio avrà coordinate X=0 e Y=0.

i) In questa pagina di appunti, quando si parla di “angolo corrente” si fa riferimento all’angolo che avrebbe un ipotetico segmento terminante nello stesso punto in cui termina l’ultima linea disegnata, sia essa una linea retta o curva, visibile o invisibile. Di default, questo angolo è pari a zero, ma è possibile modificarlo utilizzando le istruzioni [ .left(ANG)] e [ .right(ANG )]. N.B.: [ .left(-ANG)] = [ .right(ANG)] e [ .left(ANG)] = [ .right(-ANG)]

j) Coordinate angolari: i comandi [ .left(ANG)] e [ .right(ANG)] modificano il valore dell’inclinazione corrente. Di default, l’inclinazione corrente è 0 (zero), quindi un qualsiasi segmento tracciato con un comando la cui esecuzione è influenzata dall’inclinazione corrente, di default viene disegnato orizzontale. Entrambi i comandi variano il valore dell’inclinazione corrente di un numero pari ad A espresso nell’unità di misura angolare corrente: [ .left(ANG)] verso sinistra (quindi in senso antiorario) e [ .right(ANG)] verso destra (quindi in senso orario). Di default, l’unità di misura dell’angolo A è il grado (un angolo piatto = 180 gradi), ma l’esecuzione del comando [ .radians()] farà sì che l’unità di misura dell’angolo A siano i radianti (un angolo piatto = π); successivamente, l’esecuzione del comando [ .degrees()] farà sì che l’unità di misura dell’angolo A siano nuovamente i gradi.

k) Per far sì che una linea (retta o curva che sia) inizi un un punto diverso dal punto finale dell’ultima linea visibile, occorre creare una linea invisibile che va dal punto finale della linea visibile, al punto iniziale della prossima linea visibile. Per rendere una linea invisibile, occorre che il comando che traccia la linea sia preceduto dal comando [ .penup()] e seguito dal comando [ .pendown()].

l) Impostare i colori: i comandi [ .color(“colore”)] e [ .color (R,G,B)]. Di default, le linee vengono tracciate di colore nero. Per impostare colori diversi, occorre usare il comando [ .color(“colore”)] dove fra gli apici è riportato (in lettere ed in lingua inglese) il nome del colore che si intende usare. In alternativa, è possibile utilizzare il comando [ .color(R,G,B)] dove ogni singola lettera maiuscola deve essere sostituita da un numero compreso fra 0 ed 1 in notazione anglosassone.

02) Tracciare linee ed archi.

import turtle                 # A) Importare il modulo turtle

TELA01 = turtle.Screen()      # B) Impostare il nome del piano cartesiano su cui appariranno i disegni come TELA01

MATITA01 = turtle.Turtle()    # C) Impostare MATITA01 come nome di uno dei tanti possibili oggetti con cui disegnare

turtle.setup(X, Y)            # D) Impostare dimensioni piano cartesiano

turtle.bgcolor(COLORE)        # E) Impostare il colore del piano cartesiano sfondo (di default è bianco).
# COLORE può essere sia un colore fra apici scritto in inglese (es. "red"), sia un colore espresso in codice [R,G,B]

turtle.color(COLORE)          # F) Impostare il colore dell’oggetto utilizzato per disegnare
# COLORE può essere sia un colore fra apici scritto in inglese (es. "red"), sia un colore espresso in codice [R,G,B]

turtle.pensize(SPESSORE)      # G) Impostare lo spessore della linea
# SPESSORE è un numero intero maggiore di zero 

turtle.speed(VEL)             # H) Impostare velocità di esecuzione dell’oggetto utilizzato per disegnare
# VEL è un numero intero compreso fra 1 e 10 dove 1 è la velocità minima, e 10 è la velocità massima.

turtle.hideturtle()           # I) Rendere invisibile l'indicatore di direzione dell’oggetto utilizzato per disegnare

turtle.showturtle()           # J) Rendere visibile l'indicatore di direzione dell’oggetto utilizzato per disegnare

turtle.penup()                # K) Impedire, all’oggetto utilizzato per disegnare, di scrivere.

turtle.pendown()              # L) Consentire, all’oggetto utilizzato per disegnare, di scrivere.

turtle.goto(X, Y)             # M) Impostare le coordinate del punto iniziale della prossima linea.
# Se preceduto da “turtle.penup()”, questo comando non traccia nulla.
# Se preceduto da “turtle.pendown ()”, questo comando traccia un segmento che va dal punto iniziale della linea precedente al punto iniziale della prossima linea.
# Di default, questo comando è “turtle.pendown ()”.

turtle.forward(LUNG) # N) Si muove in avanti (rispetto all’angolo corrente) di LUNG punti.
# SE LUNG < 0, il segmento si estenderà nella direzione opposta.

turtle.backward(LUNG) # O) Equivale a [turtle.forward(-LUNG)]

turtle.left(ANG)      # P) Modifica l’angolo corrente di ANG gradi più a sinistra

turtle.right(ANG)     # Q) Modifica l’angolo corrente di ANG gradi più a destra 

tarta.setheading(ANG) # R) Imposta “angolo corrente” = ANG

turtle.circle(RAG)           # S) Tracciare, con l’oggetto utilizzato per disegnare, una circonferenza avente raggio RAG
# La circonferenza così tracciata, inizia e finisce nello stesso punto in cui è terminata la figura precedente.
# Se RAG è un  numero negativo, la circonferenza verrà disegnata tangente alla circonferenza che sarebbe stata disegnata se RAG fosse stato un numero positivo. 

turtle.circle(RAG, ANG) # T)Tracciare un arco di circonferenza avente raggio = RAG (punti), ed ampiezza = ANG (gradi)
# Il raggio RAG è sempre un numero intero, e può essere sia maggiore di zero, sia minore di zero;
# Se RAG<0, l’arco di circonferenza verrà disegnato tangente all’arco di circonferenza che sarebbe stato disegnato se RAG>0
# L’angolo ANG, di default, è espresso in gradi, e può essere  sia maggiore di zero, sia minore di zero.
# Se ANG > 0, l’arco di circonferenza si allontanerà dalla figura precedente;
# Se ANG < 0,  l’arco di circonferenza si avvicinerà dalla figura precedente.

U) Disegnare una figura colorata.
Mettendo insieme in modo opportuno le istruzioni spiegate in precedenza, è possibile creare il perimetro di qualunque figura si desideri; qualora si intenda colorare la superficie della figura geometrica disegnata, occorre far precedere tutte le istruzioni che formano la figura da una apposita istruzione che dichiari che le istruzioni seguenti andranno a formare una figura colorata, poi occorre riportare tutte le istruzioni utili per generare la figura da colorare, poi occorre riportare l’istruzione che definisce il colore della figura, infine una apposita istruzione che dichiari che le istruzioni per generare una figura colorata sono terminate.
Nel caso specifico in cui si desideri colorare di giallo il cerchio interno ad una circonferenza rossa, le istruzioni sono le seguenti:
turtle.begin_fill()    # A) Prima istruzione per disegnare una figura piena di colore
turtle.color("red")    # B)) Definire il colore corrente
turtle.circle(50)      # C) Tracciare una circonferenza avente raggio 50
turtle.color("yellow") # D) Definire il colore corrente
turtle.end_fill()      # E) Ultima istruzione per disegnare una figura piena di colore

turtle.write(MESSAGGIO) # V) Scrive il contenuto della variabile MESSAGGIO sul piano cartesiano 

turtle.position()  # W1) Fornisce le coordinate correnti (X, Y) del cursore.

turtle.heading()   # W2) Fornisce l’angolo corrente del cursore.

X) Ripristino delle condizioni di default.
turtle.reset() # X) Cancella quanto disegnato, porta  nella posizione (X=0, Y=0) e lo orienta verso destra.

Y) Cancellare ciò che appare sul piano cartesiano.
turtle.clear() # Y) Cancella quanto disegnato nella finestra, senza spostare l’oggetto con cui scrive.

Z) Riportare il puntatore nella condizIone di default.
turtle.home() # Z) Posiziona l’oggetto con cui scrive nel punto del piano cartesiano avente coordinate X=0, Y=0 e lo orienta verso destra