# ############################################################################### # Ce programme génère automatiquement un ensemble d'images en PNG correspondant # # à un zoom dans l'ensemble de Mandelbrot en fonction du numéro de l'image # # donné par l'explorateur de l'ensemble de Mandelbrot sur Gecif.net # # # # Programme réalisé le 5 novembre 2022 par Jean-Christophe MICHEL # # www.gecif.net # # ############################################################################### import matplotlib.pyplot as plt import matplotlib.colors as colors import math def colonne(i): # cette fonction renvoie la colonne (entre 0 et 3) de la portion i (0<=i<=15) return i % 4 #**************************************************************************** def ligne(i): # cette fonction renvoie la ligne (entre 0 et 3) de la portion i (0<=i<=15) if i in [0,1,2,3]: return 0 if i in [4,5,6,7]: return 1 if i in [8,9,10,11]: return 2 if i in [12,13,14,15]: return 3 #**************************************************************************** # résolution des images à créer : res_x=800 res_y=600 # liste des images à créer : liste_images=['A36AF14','A36AF18','A36AF19'] # traite chacune des images contenues dans le liste liste_images : for image in liste_images: # Ensemble de Mandelbrot complet : x_min=-2.61458333330719 x_max=1.33333333332000 y_min=-1.56250000000000 y_max=1.39843749997039 # calcule la taille du zoom (valeur des 4 variables x_min, x_max, y_min et y_max) en fonction du numéro de l'image : niveau=len(image)-1 largeur_x=(x_max-x_min)/4 largeur_y=(y_max-y_min)/4 origine_x=x_min origine_y=y_min for i in range(niveau): c=image[i] origine_x=origine_x+largeur_x*colonne(int(c,16)) origine_y=origine_y+largeur_y*ligne(int(c,16)) largeur_x=largeur_x/4 largeur_y=largeur_y/4 c=image[-1] x_min=origine_x+colonne(int(c,16))*largeur_x y_min=origine_y+ligne(int(c,16))*largeur_y x_max=x_min+largeur_x y_max=y_min+largeur_y # calcul automatique du nombre d'itérations en fonction du zoom : grossissement=4/(x_max-x_min) iter_max=int((math.log10(grossissement)/12)*1000+100) tab = [] pour_cent=0 print('================================================================') print(' Image : %s' % image) print('================================================================') print("Grossissement : %g" % grossissement) print("Nombre d'itérations :",iter_max) print("Progression du calcul de l'image %s :" % image) # image symétrisée en y : for py in range(res_y,0,-1): ligne_x=[] if py % (res_y//10)==0: pour_cent+=10 print("%d %% calculé ..." % pour_cent) for px in range(1,res_x+1): n=0 x=x_min+px*(x_max-x_min)/res_x y=y_max-py*(y_max-y_min)/res_y z=complex(x,y) z2=z while(abs(z)<2): z=z*z+z2 n+=1 if n>=iter_max: break ligne_x.append(n) tab.append(ligne_x) # crée une figure dans la fenêtre avec une résolution de 100 pixels par pouce : fig=plt.figure(1, figsize=(res_x/100, res_y/100)) # crée un axe dans la figure : ax=fig.add_subplot(1,1,1) # n'affiche pas les graduations sur les axes : ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) # agrandit le repère à toute la surface de la figure : plt.gcf().subplots_adjust(left = 0, bottom = 0, right = 1, top = 1, wspace = 0, hspace = 0) # convertit le tableau de valeurs tab en image : ax.imshow(tab, cmap='RdBu', interpolation='none') # enregistre l'image dans un fichier PNG avec une résolution de 100 pixels par pouce : nom_fic=image+'.png' plt.savefig(nom_fic) print("L'image a été enregistrée dans le fichier %s\n" % nom_fic)