import matplotlib.pyplot as plt

def est_bornee(z, c, n_iter):
    i = 0
    w = z
    reel = 2
    while i < n_iter and abs(w) <= reel:
        w = w * w + c
        i += 1
    return i

class Parametres:

    def __init__(self, c, xc=0, yc=0, n=300, zoom=60, n_iter=64, r=None):
        self.c = c
        self.xc = xc
        self.yc = yc
        self.n = n # nombre de pixels
        self.zoom = zoom
        self.n_iter = n_iter

        # portion affichée de l'image
        taille = 2 / zoom
        self.xmin = xc - taille
        self.xmax = xc + taille
        self.ymin = yc - taille
        self.ymax = yc + taille


def affixe(pixel, parametre):
    i, j = pixel
    x = parametre.xmin + j * (parametre.xmax - parametre.xmin) / parametre.n
    y = parametre.ymax + i * (parametre.ymin - parametre.ymax) / parametre.n
    return x + 1j * y

def matrice_nulle(n):
    m = [None] * n # lignes
    for ligne in range(n):
        m[ligne] = n * [0] # colonnes
    return m

def parametres_julia(parametre):
    matrice = matrice_nulle(parametre.n)
    for i in range(parametre.n):
        for j in range(parametre.n):
            z = affixe((i, j), parametre)
            k = est_bornee(
                z=z, 
                c=parametre.c, 
                n_iter=parametre.n_iter, 
            )
            matrice[i][j] = k
    return matrice

def afficher_julia(matrice, parametre):
    plt.imshow(
        matrice, # les données
        interpolation='bicubic', 
        cmap="gnuplot2", # couleur
        extent=(parametre.xmin, parametre.xmax, parametre.ymin, parametre.ymax)
    )
    plt.show()

c = -0.744 + 0.145 * 1j
# c = -0.1 - 0.65 * 1j
# c = -0.512 + 0.521  * 1j
# c = -0.123 + 0.745 * 1j #(lapin de Douady)
# c = 0.285 + 0.013 * 1j

figure, axes = plt.subplots(facecolor="blue")
axes.set_axis_off()

parametre = Parametres(
    c = c, 
    xc=0, 
    yc=0, 
    n=2000, 
    n_iter=800, 
    zoom=1.2
)

m = parametres_julia(parametre)

afficher_julia(m, parametre)