import random

szerokosc_obrazu = 500
wysokosc_obrazu = 500
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_x[1] - zakres_liczb_x[0]) / wysokosc_obrazu


def piksel_na_liczby(x_piksela, y_piksela):
    x_piksela = x_piksela * piksel_na_liczby_x + (zakres_liczb_x[1] + zakres_liczb_x[0]) / 2
    y_piksela = y_piksela * piksel_na_liczby_y + (zakres_liczb_y[1] + zakres_liczb_y[0]) / 2
    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, 0)) for _ in range(max_iteracji)]

import turtle

# ustawiamy rozmiar ekranu
turtle.setup(szerokosc_obrazu, wysokosc_obrazu)

krok = 3

turtle.tracer(0, 0)
turtle.hideturtle()
turtle.colormode(255)
turtle.penup()

# rysujemy
for px in range(-int(szerokosc_obrazu / 2), int(szerokosc_obrazu / 2), int(krok)):
    for py in range(-int(wysokosc_obrazu / 2), int(wysokosc_obrazu / 2), int(krok)):
        x, y = piksel_na_liczby(px, py)
        m = mandel(x, y, 2, max_iteracji)

        if m < max_iteracji:
            color = kolory[m]
            turtle.color(color)
            turtle.dot(krok, color)
            turtle.goto(px, py)
    turtle.update()

turtle.mainloop()
