4.2. Trasformazioni Come trasformare poligoni. Nel piano cartesiano un poligono può essere individuato dai suoi vertici. Poiché possiamo rappresentare un punto con una coppia di numeri, una tupla di due elementi, un poligono può essere rappresentato da una sequenza di coppie di numeri. Iniziamo a scrivere la procedura test() che crea un piano cartesiano, un poligono e lo disegna. Ovviamente per prima cosa dobbiamo caricare dalla libreria la classe Plane:
from pycart import Plane
def test(): # crea un ogg. della classe Plot e disegna gli assi
piano=Plane(“Trasformazioni”, 600, 600, 15, 15) piano.axes(True)
- # predispone un pol. da cui partire per le trasformazioni
- poligono=((3, 4), (1, 5), (2, 3), (3, 3), (5, 1))
- # modifica spessore della penna e colore
- piano.setwidth(2) piano.setcolor(“#a0a020”)
- # disegna il poligono
- piano.drawpoly(poligono)
if __name__ == “__main__”: test () L’ultima riga dice a Python che se questo file viene eseguito direttamente, non caricato come libreria, allora deve essere eseguita la funzione test(). Eseguendo il programma (<F5>) viene tracciato il poligono di vertici: (3, 4), (1, 5), (2, 3), (3, 3), (5, 1) con spessore della penna pari a 2 e di colore verde marcio. A questo punto affrontiamo le trasformazioni geometriche. La prima trasformazione che si studia di solito è la traslazione. Incominciamo da questa. Per traslare un intero poligono, basta traslare i suoi vertici, quindi iniziamo costruendo una funzione che ricevuti due argomenti, un punto e una traslazione restituisca il punto traslato. Tutte le prossime funzioni vanno scritte tra l’istruzione: “from pycart import Plane” e la linea: “def test():”. Un commento che mette in evidenza la sezione relativa alla traslazione può essere utile. Se xp e yp sono le coordinate del punto e xt e yt sono le componenti della traslazione, le coordinate del punto traslato sono: xp+xt e yp+yt. In Python, per mettere i due elementi di una coppia in due variabili, è possibile usare gli indici: xp=punto[0] yp=punto[1] oppure usare una sintassi più diretta e, a mio avviso, più espressiva: xp, yp = punto A questo punto possiamo realizzare la funzione traslapunto(punto, traslazione): ##### # Traslazione ###
- def traslapunto(punto, traslazione):
- xp, yp = punto xt, yt = traslazione return xp+xt, yp+yt
Qui sono andato in crisi, è buona norma corredare tutte le funzioni di opportuni commenti, ma non sono riuscito a trovare qualche frase che potesse chiarire il significato più di quanto già faccia il codice. Il passo successivo è scrivere una funzione che, data una sequenza di punti e una traslazione, restituisca una sequenza che contenga i punti traslati. Anche in questo caso Python mette a disposizione due metodi. Con il primo si parte da una lista vuota “result” e , per ogni elemento della sequenza poligono, si aggiunge il suo traslato alla lista “result”: def traslapoli(poligono, traslazione):
result=[] for vertice in poligono:
result.append(traslapunto(vertice, traslazione))return result
Lo stesso effetto può essere ottenuto con un costrutto tipico di Python: la costruzione di liste: il risultato è la lista che ha per elementi i traslati in base a traslazione degli elementi di poligono: def traslapoli(poligono, traslazione):
- return [traslapunto(vertice, traslazione) for vertice in
- poligono]
Molto sintetica, ma una volta che ci si abitua, anche molto espressiva. A questo punto non ci resta che aggiungere alla funzione test() le istruzioni per disegnare il poligono traslato. Dopo la riga ”piano.drawpoly(poligono)” scriveremo: # Traslazione
piano.setcolor(“#20a0a0”) piano.drawpoly(traslapoli(poligono, (-10, 5)))
Ora abbiamo tutti gli strumenti per realizzare le altre trasformazioni che conosciamo.
Riassumendo Un punto può essere rappresentato da una coppia di numeri. Un poligono può essere rappresentato da una sequenza di coppie di numeri. Pycart mette a disposizione la classe Plain che, tra gli altri, ha i metodi: axes che disegna gli assi cartesiani, drawpoly che disegna un poligono. La trasformazione di un poligono può essere realizzata in due passi: la trasformazione di un punto, l’applicazione della trasformazione a tutti i punti del poligono.