Итак, я создал простой код масштабирования Мандельброта, который увеличивает (lmb) или out (rmb) там, где вы щелкаете. Часть рендера уменьшается вдвое при каждом клике, так как она увеличивается в кривой.
Проблема не в том, насколько велико число максимума и аддитора, фрактал всегда кажется размытым при значении 2 ^ 47. , Вот как это выглядит при увеличении 2 ^ 49.
В любом случае ниже приведен мой код. Может кто-нибудь сказать мне, почему он становится размытым и как я могу решить эту проблему?
import numpy as np
from numba import jit
from matplotlib import pyplot as plt
from matplotlib import colors
from datetime import datetime
width, height, resolution = 8, 8, 100
maxiter = 50 #starting maxiter
additer = 50 #value to add to maxiter upon zoom
xmin, xmax = -2, 1
ymin, ymax = -1.5, 1.5
zoom = 1
color = 'terrain' #https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html
#--------------------------------------------------------------------------------------------------#
@jit
def mandel(c, maxiter):
z = c
for n in range(maxiter):
if (z.real*z.real + z.imag*z.imag)>4: #if z diverges
return n
z = (z * z) + c
return 0
@jit
def mandelbrot(xmin, xmax, ymin, ymax, maxiter):
re = np.linspace(xmin, xmax, width*resolution)
im = np.linspace(ymin, ymax, height*resolution)
answer = np.empty((width*resolution, height*resolution))
for y in range(height*resolution):
for x in range(width*resolution):
answer[x,y] = mandel(re[x] + 1j*im[y], maxiter) #iteration count at (re, im)
return answer
def onclick(event):
global zoom, xmax, xmin, ymax, ymin, maxiter
if event.button == 1:
zoom *= 2
maxiter += additer
elif event.button == 3:
zoom/=2
if maxiter > additer:
maxiter -= additer
#get the re,im coordinate position of mouse
posx = xmin + (xmax-xmin)*event.xdata/(width*resolution)
posy = ymin + (ymax-ymin)*event.ydata/(height*resolution)
print(posx, posy, "iter:", maxiter, "zoom:", zoom)
#change max and min so the coordinate is at the center
xmin = posx - (1.5/zoom)
xmax = posx + (1.5/zoom)
ymin = posy - (1.5/zoom)
ymax = posy + (1.5/zoom)
#recalculate and display
answer = mandelbrot(xmin, xmax, ymin, ymax, maxiter)
plt.imshow(answer.T, cmap=color)
plt.draw()
#for benchmarking
'''a = datetime.now()
mandelbrot(xmin, xmax, ymin, ymax, zoom)
print(datetime.now() - a)'''
answer = mandelbrot(xmin, xmax, ymin, ymax, maxiter)
plt.connect('button_press_event', onclick)
plt.imshow(answer.T, cmap=color)
plt.axis('off')
plt.tight_layout()
plt.show()