L-System > Curva di Koch – 4

La variante della curva di Koch con angolo di 90°, realizzata con la tecnica L-System


La grammatica

  • variabile: F
  • costanti: +,
  • assioma: F
  • regola di produzione:
    • F → F+F-F-FF+F+F-F

In pratica…

  • Per ogni F: avanza, gira a sinistra, avanza, gira a destra, avanza, gira a destra, avanza, avanza, gira a sinistra, avanza, gira a sinistra, avanza, gira a destra, avanza
  • Angolo: 90°
  • Passo: precalcolato…

Ecco gli sviluppi al variare del livello di produzione

Liv.StringaLung.
1F1
2F+F-F-FF+F
+F-F
14
3F+F-F-FF+F
+F-F+F+F-F
-FF+F+F-F-
F+F-F-FF+F
+F-F-F+F-F
-FF+F+F-FF
+F-F-FF+F+
F-F+F+F-F-
FF+F+F-F+F
+F-F-FF+F+
F-F-F+F-F-
FF+F+F-F
118
4...950
5...7606
import math
import turtle
#-----------------------------------------------
WIDTH  = 800             # Dimensione finestra
HEIGHT = 600             # ...
LIVELLI= 5               # Numero livelli
#-----------------------------------------------
W      =-WIDTH*0.45      # Posizione iniziale
H      = 0               # ...
DIR    = 0               # Direzione iniziale
ANGOLO = 90              # Angolo a sinistra
#----------------------------------------------- Passo della tartaruga
coseno = math.cos(math.radians(ANGOLO))
SIZE   = WIDTH*0.9 / (4**(LIVELLI-1))
#-----------------------------------------------
R      = 'F'
REGOLE = {'F':'F+F-F-FF+F+F-F','+':'+', '-':'-'}
#-----------------------------------------------
def trasforma(R):
    R2=''
    for x in R:
        R2 += REGOLE[x]
    return R2
#-----------------------------------------------
def prepara():
    turtle.setup(width=WIDTH, height=HEIGHT)
    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()
#-----------------------------------------------
def disegna(R):    
    STACK=[]
    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)

Lascia un commento