# Créé par Devouges Pacal, le 14/10/2013 en Python 3.2 from tkinter import * def fract1(n,x1,y1,x2,y2): # fract1 crée une courbe du dragon d'ordre n entre les points A1 et A2 de coordonnées # x1,y1 et x2,y2 dans cet ordre. # Attention la fenètre dans un canevas à son origine en haut à gauche. # La courbe du dragon d'ordre n est la réunion des 2 courbes du dragon d'ordre n-1 # entre les points A3 et A1 d'une part A3 et A2 d'autre part. # A3 est construit de telle sorte que le triangle A1A2A3 soit rectangle et isocèle en A3 # La fonction est donc récursive et l'arrêt des appels récursifs se fait quand n=1 # auquel cas le segment reliant les 2 points est tracé. if n==1: can1.create_line(x1,y1,x2,y2,width=2,fill=coul) else: x3=(x1+x2)/2+(y2-y1)/2 y3=(y1+y2)/2+(x1-x2)/2 fract1(n-1,x3,y3,x1,y1) fract1(n-1,x3,y3,x2,y2) # Remarquez la structure générale de la fonction récursive # if..pour l'arrêt de l'empilement #else ..appel à elle-même # Remarquez aussi que cette fonction fait appel à elle-même 2 fois # c'est à dire que pour n=1 il y 1 segment # pour n=2 il y en a 2 # pour n=3 il y en a 4 # pour n il y en a 2 puissance n-1 # donc une complexité exponentielle qui signifie que pour n grand (n>15 !) il faudra du temps pour voir la courbe # Il y aura 2 puissance 14 soit 16384 segments tracés pour n=15! def trace(event): can1.delete(ALL) fract1(eval(entree.get()),300,200,100,200) #tkinter est utilisé pour le tracé et le explications concernant ce module se trouvent sur d'autres fichiers. coul = 'dark green' fen1 = Tk() can1 = Canvas(fen1,bg='dark grey',height=400,width=400) can1.pack(side=LEFT) bou = Button(fen1,text='Donner la valeur de n puis appuyer sur entrée') bou.pack() entree = Entry(fen1) entree.bind("",trace) entree.pack() bou1 = Button(fen1,text='Quitter',command=fen1.quit) bou1.pack(side=BOTTOM) fen1.mainloop() # démarrage du réceptionnaire d'événements fen1.destroy() # destruction (fermeture) de la fenêtre