L-System > Curva a C – 2

Una variazione della curva C realizzata con la tecnica L-System.
Inizialmente assomiglia alla curva di Koch, ma più avanti si autointerseca e assomiglia sempre più alla chioma di un albero.


La grammatica

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

In pratica…

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

Ecco gli sviluppi al variare del livello di produzione

Liv.StringaLung.
1F1
2+F--F++F--
F+
12
3++F--F++F-
-F+--+F--F
++F--F++++
F--F++F--F
+--+F--F++
F--F++
56
4...232
5...936
6...3752
7...15016
import math
import turtle
#-----------------------------------------------
WIDTH  = 800            # Dimensione finestra
HEIGHT = 400            # ...
LIVELLI= 7              # Numero livelli
#-----------------------------------------------
W      =-WIDTH*0.3      # Posizione iniziale
H      =-HEIGHT*0.3     # ...
DIR    = 0              # Direzione iniziale
ANGOLO = 60             # Angolo a sinistra
#-----------------------  Passo della tartaruga
SIZE   = WIDTH*0.6 / 2**(LIVELLI-1)
#-----------------------------------------------
R      = 'F'
REGOLE = {'F':'+F--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.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()

Lascia un commento