193 lines
4.5 KiB
Python
193 lines
4.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
from turtle import *
|
|
|
|
# Génération de plante par grammaire L-system
|
|
|
|
def initialisation():
|
|
# Définition des variables indépendantes de la grammaire
|
|
global nbiteration, longueur
|
|
# Pour le flocon de Koch
|
|
#nbiteration = 3
|
|
#longueur = 2
|
|
|
|
# Pour le flocon de Koch Island
|
|
#nbiteration = 3
|
|
#longueur = 2
|
|
|
|
# Pour la plante
|
|
#nbiteration = 5
|
|
#longueur = 5
|
|
|
|
# Pour la plante 2
|
|
#nbiteration = 5
|
|
#longueur = 5
|
|
|
|
# Pour la plante 3
|
|
#nbiteration = 4
|
|
#longueur = 8
|
|
|
|
# Pour la plante 4
|
|
#nbiteration = 7
|
|
#longueur = 1
|
|
|
|
# Pour la plante 5
|
|
#nbiteration = 7
|
|
#longueur = 1
|
|
|
|
# Pour la plante 6
|
|
nbiteration = 5
|
|
longueur = 4
|
|
|
|
def grammaire():
|
|
# Définition de la grammaire
|
|
# Pour le flocon de Koch
|
|
#angle = 90
|
|
#axiom = 'F-F-F-F'
|
|
#regle = 'F+F-F-F+F'
|
|
|
|
# Pour le flocon de Koch Island
|
|
#angle = 90
|
|
#axiom = 'F-F-F-F'
|
|
#regle = 'F-F+F+FF-F-F+F'
|
|
|
|
# Pour la plante
|
|
#angle = 25.7
|
|
#axiom = 'F'
|
|
#regle = 'F[+F]F[-F]F'
|
|
|
|
# Pour la plante 2
|
|
#angle = 20
|
|
#axiom = 'F'
|
|
#regle = 'F[+F]F[-F][F]'
|
|
|
|
# Pour la plante 3
|
|
#angle = 22.5
|
|
#axiom = 'F'
|
|
#regle = 'FF-[-F+F+F]+[+F-F-F]'
|
|
|
|
# Pour la plante 4
|
|
#angle = 20
|
|
#axiom = 'X'
|
|
#regle1 = 'F[+X]F[-X]+X'
|
|
#regle2 = 'FF'
|
|
|
|
# Pour la plante 5
|
|
angle = 25.7
|
|
axiom = 'X'
|
|
regle1 = 'F[+X][-X]FX'
|
|
regle2 = 'FF'
|
|
|
|
# Pour la plante 6
|
|
angle = 22.5
|
|
axiom = 'X'
|
|
regle1 = 'F-[[X]+X]+F[+FX]-X'
|
|
regle2 = 'FF'
|
|
|
|
return angle, axiom, regle1, regle2
|
|
|
|
def production(axiom, regle1, regle2):
|
|
# Génération de la chaine de caractères
|
|
i = 0
|
|
while i < nbiteration:
|
|
j = 0
|
|
axiom2 = ''
|
|
while j < len(axiom):
|
|
pointeur1 = axiom[j]
|
|
|
|
# Symboles non terminaux
|
|
if pointeur1 == 'X':
|
|
# remplacement de la règle dans l'axiome
|
|
axiom2 = axiom2 + regle1
|
|
|
|
# Symboles terminaux
|
|
if pointeur1 == '+':
|
|
axiom2 = axiom2 + '+'
|
|
if pointeur1 == '-':
|
|
axiom2 = axiom2 + '-'
|
|
if pointeur1 == '[':
|
|
axiom2 = axiom2 + '['
|
|
if pointeur1 == ']':
|
|
axiom2 = axiom2 + ']'
|
|
if pointeur1 == 'F':
|
|
axiom2 = axiom2 + 'F'
|
|
|
|
j = j + 1
|
|
axiom = axiom2
|
|
print axiom
|
|
|
|
m = 0
|
|
axiom3 = ''
|
|
while m < len(axiom):
|
|
pointeur2 = axiom[m]
|
|
|
|
# Symboles non terminaux
|
|
if pointeur2 == 'F':
|
|
# remplacement de la règle dans l'axiome
|
|
axiom3 = axiom3 + regle2
|
|
|
|
# Symboles terminaux
|
|
if pointeur2 == '+':
|
|
axiom3 = axiom3 + '+'
|
|
if pointeur2 == '-':
|
|
axiom3 = axiom3 + '-'
|
|
if pointeur2 == '[':
|
|
axiom3 = axiom3 + '['
|
|
if pointeur2 == ']':
|
|
axiom3 = axiom3 + ']'
|
|
if pointeur2 == 'X':
|
|
axiom3 = axiom3 + 'X'
|
|
|
|
m = m + 1
|
|
axiom = axiom3
|
|
i = i + 1
|
|
|
|
print axiom
|
|
return axiom
|
|
|
|
def interpretation(angle, axiom):
|
|
# Interprétation de la chaine par turtle
|
|
k = 0
|
|
laposition = []
|
|
langle = []
|
|
while k < len(axiom):
|
|
pointeur2 = axiom[k]
|
|
|
|
# Interpréation
|
|
if pointeur2 == 'F':
|
|
forward(longueur)
|
|
elif pointeur2 == '+':
|
|
left(angle)
|
|
elif pointeur2 == '-':
|
|
right(angle)
|
|
elif pointeur2 == '[':
|
|
# mémorisation de la position courante
|
|
laposition.append(position())
|
|
langle.append(heading())
|
|
elif pointeur2 == ']':
|
|
# retour à la dernière position et suppression de celle-ci
|
|
up()
|
|
goto(laposition[len(laposition)-1][0], laposition[len(laposition)-1][1])
|
|
del laposition[len(laposition)-1]
|
|
setheading(langle[len(langle)-1])
|
|
del langle[len(langle)-1]
|
|
down()
|
|
|
|
k = k + 1
|
|
|
|
# Placement initial de la tortue
|
|
up()
|
|
backward(400)
|
|
down()
|
|
|
|
# Programme principal
|
|
## gram[0] retourne l'angle
|
|
## gram[1] retourne l'axiome
|
|
## gram[2] retourne la règle
|
|
|
|
initialisation()
|
|
gram = grammaire()
|
|
axio = production(gram[1], gram[2], gram[3])
|
|
interpretation(gram[0], axio)
|
|
|
|
#quit()
|