Le Tartarughe e i frattali

Il termine frattale (variante di frazione) indica una figura geometrica la cui dimensione non è intera. Non voglio darne qui una definizione e tanto meno elencarne o dimostrarne le proprietà. Lo scopo è piuttosto quello di evidenziare due tecniche diverse di tracciare le figure approssimanti. Si userà infatti la tartaruga LOGO in modo ricorsivo ma ogni esempio sarà poi trascritto usando anche il parallelismo delle tartarughe di StarLogo. Ritengo infatti molto interessante da un punto di vista didattico questa trascrizione sia perché spesso risulta più intuitiva della ricorsività sia perché è un buon sistema con cui giovani studenti possono prendere confidenza con la programmazione parallela. Abbiamo già usato questo metodo nel paragrafo sul disegno dell'albero.
Anche adesso lavoreremo in StarLogo con i patch di ampiezza 1 e dunque con la solita convenzione sui colori.

In questa prima parte useremo per iniziare una procedura definita nell'ambiente osservatore che cancella lo schermo, crea una sola tartaruga e le chiede di abbassare la penna

La curva di Kock

Si può considerare definita da

  1. -un segmento
  2. -quattro segmenti (della stessa struttura della curva di Kock) ottenuti dividendo in tre parti uguali il segmento e sostituendo la parte centrale con un triangolo equilatero senza base.

Nello scrivere la procedura ricorsiva LOGO che disegna la curva osseviamo che semplicemente occorre richiamare la procedura 4 volte su ogni tratto disponendo nella direzione appropriata la tartaruga. Il momento cruciale è quello di profondità massima: questa volta non imponiamo la trasparenza dello stato in quanto facciamo avanzare la tartaruga della lunghezza prevista. La procedura ha come parametri la lunghezza del passo e la profondità cui vogliamo fermarci.

Si dice "fiocco di neve" la figura ottenuta da un triangolo equilatero sui cui lati si sviluppa la curva di Kock



to fioccodineve :dim :prof
repeat 3 [kock :dim  :prof rt 120]
end

to kock :dim :prof 
if :prof = 0 [fd :dim stop]
kock :dim / 3  :prof - 1
lt 60 kock :dim / 3 :prof - 1
rt 120 kock :dim / 3 :prof - 1
lt 60 kock :dim / 3 :prof - 1
end
 

Ecco l'immagine ottenuta con la solita procedura di inizializzazione, uso di colori e con il comando fioccodineve 280 8 non senza aver prima posizionato opportunamente la penna.
koch

Con qualche ricordo di geometria, legato al fatto che il triangolo su cui si sviluppa il fiocco è equilatero (come è evidenziato nella figura koch
ottenuta con fioccodineve 280 0), possiamo individuarne il centro (seconda e terza delle istruzioni seguenti) e (quarta e quinta istruzione) riposizionare la tartaruga in modo da tracciare figure concentriche.


pu               ; per non lasciare traccia
rt 30            ; per bisecare l'angolo
fd 140 / cos 30  ; per arrivare al centro
bk 70 / cos 30  ; si posiziona per il nuovo fiocco 
lt 30            ; si posiziona per il nuovo fiocco
pd               ; abbassa la penna
fioccodineve 140 8
 

La figura
koch
mostra un insieme di curve ottenute con questa tecnica.

Trascriviamo questa costruzione nel caso dell'ambiente parallelo usando la tartaruga madre che nel suo cammino genera quattro figlie cui assegna lo stesso suo compito su un cammino di lunghezza un terzo. Le quattro figlie nasceranno in ben precisi momenti e inoltre alcune dovranno eseguire certi compiti come cambiare direzione. La tartaruga madre dovrà poi morire. Ogni tartaruga ha delle variabili che mimano un suo elementare codice genetico: il suo livello generazionale e la lunghezza del passo che sa compiere. Questa volta nella procedura di inizializzazione non chiediamo di abbassare la penna. L'ultima generazione permessa lo deciderà da sola.

 
turtles-own[generazione lun]

to lato  :max 
if generazione = :max  [ stop]
if generazione = :max - 1 [pd ]
hatch [ set generazione generazione + 1 set lun lun / 3 ]
fd lun
hatch [lt 60 setc blue set generazione generazione + 1 
set lun lun / 3  ]
fd lun
hatch [ set generazione generazione + 1 set lun lun / 3 ]
hatch [ lt 120 pu  fd lun rt 180 set generazione generazione + 1 
set lun lun / 3  ]
fd lun
die
end

 

Al solito, abbiamo bisogno del bottone forever. Per formare la curva di neve ricorriano a un piccolo stratagemma. Facciamo in modo che la tartaruga Adamo ( identificata dal who number 0, la prima volta costruisca il triangolo di base). In conclusione otteniamo:

 
turtles-own[generazione lun fatto]

to lato  :max 
if generazione = :max [ stop]
if generazione = :max - 1 [pd ]
hatch [ set generazione generazione + 1 set lun lun / 3 ]
fd lun
hatch [lt 60 setc blue set  generazione  generazione + 1 
set lun lun / 3  ]
fd lun
hatch [ set generazione generazione + 1 set lun lun / 3 ]
hatch [ lt 120 pu  fd lun rt 180 set generazione generazione + 1
set lun lun / 3  ]
fd lun
;die  occorre eliminare questa istruzione dal precedente programma
end

to nuovofiocco :max
if who > 0 [lato :max die]
if who = 0 and fatto = 0
[repeat 3 [ lato :max rt 120]
    set fatto-of 0 true]
end 
 

con il patch di ampiezza 2, dopo set lun 20 , la ripetizione di nuovofiocco 3 mostra la figura
koch.

nuovofiocco 5 con set lun 40 mostra invece
koch.

Osserviamo che si possono ottenere le stesse figure posizionando opportunamente le tartarughe. Sono esse stesse a darci l'idea della curva. Il fiocco di neve senza usare l'istruzione della seconda riga di lato si mostra come in
koch
se chiamiamo la procedura nuovofiocco con il valore 3, mentre non si nota nulla di diverso rispetto al caso precedente se scegliamo il valore 5. La differenza evidente è che adesso la morte delle tartarughe cancella ovviamente la figura.

Basta poco per avere frattali diversi. Ad esempio

 
to nuovi :max
lato :max
rt 120
lato:max
rt 120
lato :max
die
end
 
stella