Bonjour
J'ai récemment décidé d'essayer de dessiner des fractales à l'aide de tkinter. Donc pour ceux qui ne le sauraient pas, voici (en gros) comment on fait (d'un point de vue mathématique):
On a une application f qui, à tout nombre complexe (représenté par un point sur le plan), associe un autre nombre complexe. Prenons f(z)=z²-0.75. Si on prend z=1+i, on a f(z)=2i-0.75. On continue ensuite en calculant f(2i-0.75), etc. Si les points d'affixe ces nombres complexes s'éloignent de l'origine, on colorie le premier point (d'affixe 1+i) en bleu. Sinon, on le colorie en noir. On obtient donc finalement une fractale qui est une figure géométrique qui est auto-similaire: une même image se retrouve à toutes les échelles.
J'ai donc fait ce code:
Bon, il est assez moche, sachant que la portion du plan que j'affiche doit être déterminée avant, mais peu importe. Mon souci est que certains points sont noirs alors qu'ils devraient être bleus. Comment pourrais-je régler ça sans trop augmenter la durée pendant laquelle le programme tourne ? (Sachant qu'elle est déjà un peu élevée ...).Code:#*-coding:Latin-1-* from tkinter import * def suite(a, b): """Fonction prenant en arguments a et b (a+ib) et déterminant s'ils appartiennent à la fractale.""" i=0 re=a im=b while i<40 and re*re+im*im<4: #On calcule les 40 premiers termes, et on vérifie que leur distance à l'origine ne dépasse pas 2. tamp=re re=re*re-im*im-3/4 im=2*tamp*im #On calcule le terme suivant. i+=1 if i==40: return (0) #Si la boucle s'est interrompue car i=40, le point sera noir. else: return(1) #Sinon il sera bleu. couleurs={} zoom=100 #Sert à déterminer la taille. for al_re in range(int(-1.5*zoom), int(1.5*zoom)): for al_im in range(int(-1.2*zoom), int(1.2*zoom)): #Pour tous les points dans une portion du plan: borne=suite(al_re/zoom, al_im/zoom) if borne==0: couleurs[al_re, al_im]="noir" else: couleurs[al_re, al_im]="bleu" #On regarde, grâce à la fonction suite, si le point est noir ou bleu, et on l'indique dans le dictionnaire couleurs. fenetre=Tk() canvas=Canvas(fenetre, height=int(2.4*zoom), width=int(3*zoom)) canvas.pack() #On crée notre fenêtre et notre Canevas. for key, couleur in couleurs.items(): if couleur=="noir": canvas.create_oval(int(1.5*zoom)+key[0], int(1.2*zoom)-key[1], int(1.5*zoom)+key[0], int(1.2*zoom)-key[1], fill="black") else: canvas.create_oval(int(1.5*zoom)+key[0], int(1.2*zoom)-key[1], int(1.5*zoom)+key[0], int(1.2*zoom)-key[1], fill="blue") #On colorie les points. fenetre.mainloop()
Merci d'avance
Bonne journée
-----