import random
from PIL import Image


szerokosc_obrazu = 1000
wysokosc_obrazu = 1000
max_iteracji = 200

# ciekawy zakres liczb
# zakres_liczb_x = (-.955, -.619)
# zakres_liczb_y = (-.28, .004)
zakres_liczb_x = (-2, 2)
zakres_liczb_y = (-2, 2)

def mandel(x0, y0, r, p):
    xx = x0
    yy = y0
    r2 = r * r

    # jeżeli punkt już jest poza zadaną granicą, zwracamy 0
    if xx * xx + yy * yy > r2:
        return 0

    for i in range(p):
        xt = xx * xx - yy * yy
        yt = 2 * xx * yy
        xx = xt + x0
        yy = yt + y0
        # sprawdzamy czy kolejny punkt jest poza zadaną granicą
        if xx * xx + yy * yy > r2:
            return i + 1
    # nie znaleziono punktu poza granicą,
    # więc zwracamy maksymalną liczbę iteracji
    # i uznajemy, że taki punkt należy do zbioru Mandelbrota
    return p

# każdy piksel odpowiada liczbie i musimy znaleźć sposób obliczenia tej liczby dla każdego piksela
piksel_na_liczby_x = (zakres_liczb_x[1] - zakres_liczb_x[0]) / szerokosc_obrazu
piksel_na_liczby_y = (zakres_liczb_y[1] - zakres_liczb_y[0]) / wysokosc_obrazu

def piksel_na_liczby(x_piksela, y_piksela):
    x_piksela = x_piksela * piksel_na_liczby_x + zakres_liczb_x[0]
    y_piksela = y_piksela * piksel_na_liczby_y + zakres_liczb_y[0]
    return x_piksela, y_piksela

# generujemy losowe kolory dla każdego numeru iteracji
kolory = [(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) for _ in range(max_iteracji)]

# towrzymy obraz o zadanych wymiarach
obraz = Image.new("RGB", (szerokosc_obrazu, wysokosc_obrazu), "black")
# dla każdego piksela
for px in range(szerokosc_obrazu):
    for py in range(wysokosc_obrazu):
        # zamieniamy piksel na liczby
        x, y = piksel_na_liczby(px, py)
        # obliczamy liczbę iteracji dla danej liczby
        m = mandel(x, y, 2, max_iteracji)
        # kolorujemy jedynie piksela odpowiadające punktom nie należącym do zbioru Mandelbrota
        if m < max_iteracji:
            obraz.putpixel((px, py), kolory[m])

# zapisujemy obraz
obraz.save("mandelbrot.png")
