L-System > Arrowhead

Si alternano due primitive F e X che si sviluppano in direzioni opposte

LivelloStringaLung.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

LivelloStringaLung.Risultato
1F1
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()

Lascia un commento