Lsystems/Python/ArbreFonctionnel3.py

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()