Coordinate

modifica

In 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

modifica

Un 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

modifica

Se 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