Мандельброт установил «разрыв» при разных значениях X и Y.

Самая насущная проблема, с которой я сталкиваюсь в своем коде, заключается в том, что когда я изменяю размеры X и Y, например, на X = 501, Y = 500, установка Мандельброта полностью рвется (см. рисунки). Оси X и Y также инвертированы.

Моя цель — добиться такого же результата, как этот http://code.activestate.com/recipes/579048-python-mandelbrot-fractal-with-tkinter/ и из того, что я могу понять, мне следует создать сопоставление координат, централизованное вокруг начала координат?

Любая помощь будет принята с благодарностью.

from tkinter import *
import numpy as np
from numba import jit

X = 500
Y = 500

maxIter = 500 

minR = -3
minI = -2
maxR = 2
maxI = 2

@jit
def mandelbrot_set(minR,maxR,minI,maxI,X,Y,maxIter):
    r1 = np.linspace(minR, maxR, X)
    r2 = np.linspace(minI, maxI, Y)
    return (r1,r2,[mandelbrot(complex(r, i),maxIter) for r in r1 for i in r2])

@jit
def mandelbrot(c,max):
    z = c
    for n in range(max):
        if abs(z) > 4:
            return n
        z = z*z + c
    return 255

set = mandelbrot_set(minR,maxR,minI,maxI,X,Y,maxIter)

window = Tk()
canvas = Canvas(window, width = X, height = Y, bg = "#FFFFFF", highlightthickness=0)
canvas.pack()
img = PhotoImage(width = X, height = Y)
canvas.create_image((0, 0), image = img, state = "normal", anchor = NW)

hexstring = ""
counter = 0
for imaginary in set[1]:
    hexstring += "{ "
    for real in set[0]:
        if set[2][counter] == 0:
            hexstring += "#000000 "
        else:
            hexstring += "#" + "%02x" % set[2][counter] + "%02x" % set[2][counter] + "%02x" % set[2][counter] + " "
        counter += 1
    hexstring += "} "

img.put(hexstring)
window.mainloop()

Обычный:

Нормальный

Сломанный Мандельброт:

Сломанный Мандельброт


person xvy.    schedule 09.01.2018    source источник
comment
ваша проблема не имеет ничего общего с tkinter - проблема в вашем алгоритме. Сравните значения в ваших функциях со значениями, сгенерированными кодом из вашей ссылки, и вы увидите, где вы допустили ошибку. Я бы сначала проверил значения из linspace.   -  person furas    schedule 09.01.2018
comment
Некоторое время назад я кодировал это на GLSL, если вам интересно, см.: множество Мандельброта GLSL   -  person Spektre    schedule 10.01.2018


Ответы (1)


Чтобы решить проблему с разрывом, вы должны заменить set[0] на set[1] в коде.

for imaginary in set[0]: # before set[1]
    hexstring += "{ "
    for real in set[1]:  # before set[0]

Код:

from tkinter import *
import numpy as np
from numba import jit

X = 510
Y = 500

maxIter = 500 

minR = -3
minI = -2
maxR = 2
maxI = 2

@jit
def mandelbrot_set(minR, maxR, minI, maxI, X, Y, maxIter):
    r1 = np.linspace(minR, maxR, X)
    r2 = np.linspace(minI, maxI, Y)
    return (r1, r2, [mandelbrot(complex(r, i), maxIter) for r in r1 for i in r2])

@jit
def mandelbrot(c,max):
    z = c
    for n in range(max):
        if abs(z) > 4:
            return n
        z = z*z + c
    return 255

set = mandelbrot_set(minR,maxR,minI,maxI,X,Y,maxIter)

window = Tk()
canvas = Canvas(window, width=X, height=Y, bg="#FFFFFF", highlightthickness=0)
canvas.pack()
img = PhotoImage(width=X, height=Y)
canvas.create_image((0, 0), image = img, state = "normal", anchor = NW)

hexstring = ""
counter = 0
for imaginary in set[0]:
    hexstring += "{ "
    for real in set[1]:
        if set[2][counter] == 0:
            hexstring += "#000000 "
        else:
            hexstring += "#" + "%02x" % set[2][counter] + "%02x" % set[2][counter] + "%02x" % set[2][counter] + " "
        counter += 1
    hexstring += "} "

img.put(hexstring)
window.mainloop()

введите здесь описание изображения


Чтобы повернуть изображение, вы должны заменить for r in r2 на for i in r1 в

 [mandelbrot(complex(r, i), maxIter) for i in r2 for r in r1]

но держи предыдущее

for imaginary in set[1]: # before set[1]
    hexstring += "{ "
    for real in set[0]:  # before set[0]

Код:

from tkinter import *
import numpy as np
from numba import jit

X = 510
Y = 500

maxIter = 500 

minR = -3
minI = -2
maxR = 2
maxI = 2

@jit
def mandelbrot_set(minR, maxR, minI, maxI, X, Y, maxIter):
    r1 = np.linspace(minR, maxR, X)
    r2 = np.linspace(minI, maxI, Y)
    return (r1, r2, [mandelbrot(complex(r, i), maxIter) for i in r2 for r in r1])

@jit
def mandelbrot(c,max):
    z = c
    for n in range(max):
        if abs(z) > 4:
            return n
        z = z*z + c
    return 255

set = mandelbrot_set(minR,maxR,minI,maxI,X,Y,maxIter)

window = Tk()
canvas = Canvas(window, width=X, height=Y, bg="#FFFFFF", highlightthickness=0)
canvas.pack()
img = PhotoImage(width=X, height=Y)
canvas.create_image((0, 0), image = img, state = "normal", anchor = NW)

hexstring = ""
counter = 0
for imaginary in set[1]:
    hexstring += "{ "
    for real in set[0]:
        if set[2][counter] == 0:
            hexstring += "#000000 "
        else:
            hexstring += "#" + "%02x" % set[2][counter] + "%02x" % set[2][counter] + "%02x" % set[2][counter] + " "
        counter += 1
    hexstring += "} "

img.put(hexstring)
window.mainloop()

введите здесь описание изображения

person furas    schedule 09.01.2018