LOGO/Coordinate
Coordinate
modificaIn logo è preferita la grafica della tartaruga che ha un riferimento intrinseco, riferito alla posizione e alla direzione di chi traccia il disegno, ma è presente anche un riferimento estrinseco: il riferimento cartesiano. Ci sono problemi in cui il riferimento cartesiano può ritornare utile. Ci sono sostanzialmente due primitive relative al riferimento cartesiano:
pos che restituisce una lista che contiene le coordinate dell'attuale posizione del puntatore grafico (la tartaruga).
setpos :p che muove il puntatore grafico nella posizione contenuta dalla lista di numeri :p.
Triangolo rettangolo
modificaUn primo problema che chiama l'uso di pos e setpos è il disegno di un triangolo rettangolo dati i cateti. È possibile risolverlo anche usando arctan, ma oltre a dover usare una funzione goniometrica, dà alcuni errori dovuti all'approssimazione e non funziona in certi casi particolari.
Per disegnare un triangolo rettangolo, possiamo disegnare un cateto, memorizzare la posizione raggiunta, disegnare l'altro cateto, spostare il puntatore grafico nella posizione memorizzata precedentemente e rimettere la tartaruga dove era stata presa:
to trirett :c1 :c2 local "v1 forward :c1 make "v1 pos back :c1 right 90 forward :c2 setpos :v1 left 90 back :c1 end
Vediamola istruzione per istruzione:
Dato che la procedura deve memorizzare una posizione, si crea una variabile locale:
local "v1
Disegna il primo cateto:
forward :c1
Associa alla parola "v1 la posizione attualmente occupata dalla tartaruga:
make "v1 pos
Torna indietro e disegna l'altro cateto:
back :c1 right 90 forward :c2
Sposta il puntatore grafico nella posizione associata alla parola "v1:
setpos :v1
Rimette la tartaruga dove si trovava all'inizio della procedura:
left 90 back :c1
Da notare che:
- Questi ultimi due comandi non possono essere sostituiti dal comando home, perché non è detto che tutti i triangoli rettangoli che si vogliono disegnare inizino (e quindi debbano terminare) nel centro dello schermo.
- In questa procedura viene usato un riferimento estrinseco (il piano cartesiano), ma non mi devo preoccupare di come è effettivamente realizzato, potrebbe anche usare coordinate polari, per capire la procedura basta sapere che la tartaruga può memorizzare una posizione e può raggiungere una certa posizione.
trirett è una procedura semplice ma si presta per risolvere problemi interessanti:
- Si possono costruire i vari quadrilateri usando solo spostamenti e triangoli rettangoli.
- Si possono realizzare inviluppi di triangoli rettangoli.
Per quanto riguarda il secondo di questi problemi si può scrivere una procedura che disegni un triangolo rettangolo, poi uno con il primo cateto diminuito e il secondo aumentato di una certa quantità poi un altro sempre con un cateto un po' più piccolo e l'altro un po' più grande, e così via:
to triangoli :cat1 :cat2 :dec if :cat1 < :dec [stop] trirett :cat1 :cat2 triangoli :cat1-:dec :cat2+:dec :dec end
Sopra ho riportato una soluzione ricorsiva, ma si sarebbe potuta realizzare anche una procedura semplicemente sequenziale:
to triangoli trirett 100 10 trirett 90 20 ... end
Possiamo combinare diversi inviluppi per ottenere figure più complicate:
to croce :dim1 :dec repeat 4 [triangoli dim1 :dec :dec left 90] end
O più complicate ancora...
Grafico di funzioni
modificaSe vogliamo realizzare una procedura che disegni il grafico di una funzione, dobbiamo usare esplicitamente il riferimento cartesiano. Di seguito riporto una soluzione non certo completa al problema, ma non proprio banale.
Prima di tutto però ci sarà utile avere una procedura che inizializzi il nostro riferimento cartesiano fissando una scala per le ascisse, una per le ordinate fissi la dimensione della finestra grafica (qui la suppongo quadrata) e disegni gli assi.
to inizializzapc clearscreen make "sx 10 make "sy 10 make "min -250 make "max 250 window hideturtle assi end
Il comando window fa sì che quando la tartaruga esce da un lato dello schermo non rientri dall'altro.
Per gli assi devo assicurarmi che la penna sia giù, scelgo un colore adatto, poi:
- disegno un asse,
- ruoto la tartaruga e disegno l'altro asse,
- disegno un punto nella posizione (1; 1) per avere un riferimento relativo alla scala.
to assi setpencolor 7 pendown asse right 90 asse left 90 penup setpos list :sx :sy pendown setpos list :sx :sy end
Usando la grafica della tartaruga non è difficile ottenere i singoli assi con le freccine regolamentari:
to asse back 250 forward 500 left 30 back 10 forward 10 right 60 back 10 forward 10 left 30 back 250 end
grafico riceve una lista che contiene la funzione e il colore assegna il colore della penna e poi traccia il grafico:
to grafico :funzione :colore setpencolor :colore traccia :min "primo pendown end
La procedura traccia è piuttosto complessa:
- Realizza un ciclo ricorsivo che porta la variabile "xs dal bordo sinistro (:min) al bordo destro (:max).
- Se è il primo punto di un arco, sposta lì il puntatore grafico senza disegnare.
- Se nel calcolo della funzione ottiene un errore o se la funzione esce dai bordi, sospende il disegno.
- La procedura deve anche eseguire la trasformazione da coordinate relative allo schermo (:xs e :ys) a coordinate relative al piano cartesiano (:x e :y) e viceversa.
to traccia :xs :stato if :xs>:max [stop] ifelse equalp :stato "primo [penup] [pendown] make "x :xs/:sx catch "error [make "y run :funzione] ifelse not emptyp error [ make "stato "primo][ make "ys :y*:sy ifelse and -1000<:ys :ys<1000 [make "stato " setpos list :xs :ys] [make "stato "primo] ] traccia :xs+10 :stato end
Le seguenti istruzioni disegnano un riferimento cartesiano, una retta e una parabola:
inizializzapc grafico [2*:x-8] 3 grafico [0.1*:x*:x+2*:x-8] 2