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