Si alternano due primitive F e X che si sviluppano in direzioni opposte
Livello | Stringa | Lung. | Risultato |
---|---|---|---|
1 2 | F +X-F-X+ | 1 7 | |
1 2 | X -F+X+F- | 1 7 |
La grammatica L-System che produce la sequenza
- variabili: F, X
- costanti: +, –
- assioma: F
- regole di produzione:
F → +X-F-X+
X → -F+X+X-
Ecco gli sviluppi al variare del livello di produzione
Livello | Stringa | Lung. | Risultato |
---|---|---|---|
1 | F | 1 | |
2 | +X-F-X+ | 7 | |
3 | +-F+X+F--+X-F-X+--F+X+F-+ | 25 | |
4 | +-+X-F-X++-F+X+F-++X-F-X+ --+-F+X+F--+X-F-X+--F+X+F -+--+X-F-X++-F+X+F-++X-F- X+-+ | 79 | |
5 | +-+-F+X+F--+X-F-X+--F+X+F -++-+X-F-X++-F+X+F-++X-F- X+-++-F+X+F--+X-F-X+--F+X +F-+--+-+X-F-X++-F+X+F-++ X-F-X+--+-F+X+F--+X-F-X+- -F+X+F-+--+X-F-X++-F+X+F- ++X-F-X+-+--+-F+X+F--+X-F -X+--F+X+F-++-+X-F-X++-F+ X+F-++X-F-X+-++-F+X+F--+X -F-X+--F+X+F-+-+ | 241 | |
6 | ... | 727 | |
7 | ... | 2185 |
Al livello 8 la stringa è lunga 6559 caratteri e l’immagine corrispondente è
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 = 60 # Angolo a sinistra
#-----------------------------------------------
SIZE = WIDTH*0.9 / 2**(LIVELLI-1)
#-----------------------------------------------
R = 'F'
REGOLE = {'F':'+X-F-X+',
'X':'-F+X+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.shape('turtle')
turtle.speed(0)
turtle.hideturtle()
turtle.penup()
turtle.setposition(W,H)
turtle.setheading(DIR)
turtle.pendown()
#turtle.tracer(0) # Per non aspettare...
#-----------------------------------------------
def disegna(R):
STACK=[]
for x in R:
if(x == '+'):
turtle.left(ANGOLO)
elif(x == '-'):
turtle.right(ANGOLO)
elif(x == 'F'):
turtle.pencolor('red')
turtle.forward(SIZE)
elif(x == 'X'):
turtle.pencolor('blue')
turtle.forward(SIZE)
#-----------------------------------------------
for j in range(LIVELLI-1):
print(len(R), '\t', str().join(R), '\n')
R=trasforma(R)
prepara()
disegna(R)
#turtle.update()