La famosissima curva di Hilbert, una curva di Peano, realizzata con la tecnica L-System
La grammatica
- variabili: A, B
- costanti: F, +, –
- assioma: A
- regola di produzione:
A → +BF-AFA-FB+
B → -AF+BFB+FA-
In pratica…
- F: avanza
- +: gira a sinistra di 90°
- –: gira a a destra di 90°
- Le lettere A e B sono ignorate
- Il passo è precalcolato
Ecco gli sviluppi al variare del livello di produzione da 2 a 7
Livello | Stringa | Lung. | Risultato |
---|---|---|---|
1 | A | 1 | |
2 | +BF−AFA−FB+ | 11 | |
3 | +-AF+BFB+FA-F-+BF-AFA-FB+ F+BF-AFA-FB+-F-AF+BFB+FA- + | 51 | |
4 | +-+BF-AFA-FB+F+-AF+BFB+FA -F-AF+BFB+FA-+F+BF-AFA-FB +-F-+-AF+BFB+FA-F-+BF-AFA -FB+F+BF-AFA-FB+-F-AF+BFB +FA-+F+-AF+BFB+FA-F-+BF-A FA-FB+F+BF-AFA-FB+-F-AF+B FB+FA-+-F-+BF-AFA-FB+F+-A F+BFB+FA-F-AF+BFB+FA-+F+B F-AFA-FB+-+ | 211 | |
5 | ... | 851 | |
6 | 3411 | ||
7 | 13651 |
Al livello 8 la stringa è lunga 54611 caratteri
import math
import turtle
#-----------------------------------------------
WIDTH = 800 # Dimensione finestra
HEIGHT = 800 # ...
LIVELLI= 8 # Numero livelli
#-----------------------------------------------
W =-WIDTH*0.45 # Posizione iniziale
H =-HEIGHT*0.45 # ...
DIR = 0 # Direzione iniziale
ANGOLO = 90 # Angolo a sinistra
#------------------------ Passo della tartaruga
SIZE = WIDTH*0.9 / (2**(LIVELLI-1)-1)
#-----------------------------------------------
R = 'A'
REGOLE = {'A':'+BF-AFA-FB+', 'B':'-AF+BFB+FA-',
'F':'F', '+':'+', '-':'-'}
#-----------------------------------------------
def trasforma(R):
R2=''
for x in R:
R2 += REGOLE[x]
return R2
#-----------------------------------------------
def prepara():
turtle.setup(width=WIDTH, height=HEIGHT)
turtle.title("Livello="+str(LIVELLI))
turtle.bgcolor('pink')
turtle.pencolor("red")
turtle.pensize(2)
turtle.penup()
turtle.shape('turtle')
turtle.speed(0)
turtle.setposition(W,H)
turtle.setheading(DIR)
turtle.pendown()
turtle.hideturtle()
turtle.tracer(0)
#-----------------------------------------------
def disegna(R):
for x in R:
if(x == '+'):
turtle.left(ANGOLO)
elif(x == '-'):
turtle.right(ANGOLO)
elif(x == 'F'):
turtle.forward(SIZE)
#-----------------------------------------------
for j in range(LIVELLI-1):
R=trasforma(R)
print(len(R), '\t', str().join(R), '\n')
prepara()
disegna(R)
turtle.update()