Python 曼德布罗特集&x27;撕裂';在不同的X和Y值下

Python 曼德布罗特集&x27;撕裂';在不同的X和Y值下,python,graphics,mandelbrot,Python,Graphics,Mandelbrot,我的代码中最紧迫的问题是,当我将X和Y尺寸更改为例如X=501,Y=500时,mandelbrot将完全撕裂(见图)。X轴和Y轴也反转 我的目标是获得与此类似的结果,根据我所能收集到的信息,我应该创建一个以原点为中心的坐标图 任何帮助都将不胜感激 from tkinter import * import numpy as np from numba import jit X = 500 Y = 500 maxIter = 500 minR = -3 minI = -2 maxR = 2

我的代码中最紧迫的问题是,当我将X和Y尺寸更改为例如X=501,Y=500时,mandelbrot将完全撕裂(见图)。X轴和Y轴也反转

我的目标是获得与此类似的结果,根据我所能收集到的信息,我应该创建一个以原点为中心的坐标图

任何帮助都将不胜感激

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()
正常:

破碎的曼德尔布罗特:


要解决撕裂问题,您必须将代码中的
set[0]
替换为
set[1]

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


要旋转图像,必须将r2中r的
替换为r1中i的

 [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]
代码:


您的问题与tkinter无关-问题在于您的算法。将函数中的值与链接中代码生成的值进行比较,您将看到哪里出错了。我将首先检查
linspace
中的值。不久前,如果您有兴趣,我将在GLSL中对其进行编码,请参见:
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()