我无法使用Mandelbrot程序写入图像;它与"(maxx-minx)/ width"的舍入错误有关。与"(maxy-miny)/ width"相比较第31行,它导致501乘500的图片而不是500平方的图片。 ((宽+ 1)*长)不(宽*长)。 我该如何解决这个问题?
from PIL import Image
from cmath import *
from math import sqrt
from numpy import arange
width = 500
height = 500
minx = -0.752 #float(input("Please enter the minimum x value:"))
maxx = -0.748 #float(input("Please enter the maximum x value:"))
miny = 0.098 #float(input("Please enter the minimum y value:"))
maxy = 0.102 #float(input("Please enter the maximum y value:"))
gradient = Image.open("mandelbrot.png")
gradlist = list(gradient.getdata())
def testMandelbrot(x, y):
z = 0 + 0j
c = x + (y*1j)
iter = 0
while iter <= 69 and sqrt(z.real**2 + z.imag**2) < 4:
z = (z*z) + c
iter += 1
if iter == 70:
return (0, 0, 0, 255)
else:
return gradlist[int((iter - 1) * 140 / 70)]
img = Image.new('RGBA', (width, height), color=(255, 255, 255, 255))
image = [testMandelbrot(x, y) for y in arange(miny, maxy, (maxy-miny)/height) for x in arange(minx, maxx, (maxx-minx)/width)] #this line creates the error ((maxx-minx)/width) / (maxx - min) gives (width+1) not width
print(len(image), img.size)
img.putdata(image)
img.save("picture111.png", "PNG")
答案 0 :(得分:2)
我建议使用numpy
's linspace
而不是arange
。它将返回一个精确给定数量的均匀间隔样本的数组。
看到linspace(0.098, 0.102, 500, endpoint=False)
正好是500分。如果要包含端点,可以省略endpoint=False
或传递endpoint=True
。
使用endpoint=False
如果生成另一个图像,其高度和宽度相同但偏移max_ - min_
之间的差异,则结果将是相邻图块,具体取决于它将导致八个图像之一。
您的代码将是:
Y = linspace(miny, maxy, height, endpoint=False)
X = linspace(minx, maxx, width, endpoint=False)
image = [testMandelbrot(x, y) for y in Y for x in X]
我将数组命名为Y
被重复使用len(X)
次,因为高度和宽度都很小(500),它的成本并不高,并且有助于提高可读性。