写一个mandelbrot设置为python中的图像

时间:2016-09-25 06:37:45

标签: python mandelbrot

我正在尝试将一个mandelbrot设置为python中的图像,并且遇到了我的一个函数问题。

问题是:我希望this之类的东西。我得到一个纯白色的图像。这是我的代码:

快速代码摘要: 检查值是否已设置,如果是,则在布尔数组中将其标记为true。然后,根据布尔数组绘制图像,着色为真,然后留下虚假的。

import math
import numpy as np
import scipy.misc as smp
from PIL import PILLOW_VERSION
from PIL import Image

def iterate(x, y, iterationNum):
    z = 0
    coord = complex(x, y)
    for a in xrange(iterationNum):
        #Don't use fabs. It can be negative.
        z = z * z + coord
        #This is a comparison between complex and int. It probably won't work.
        #You want |Z| which is: z.real ** 2 + z.imag ** 2 > 4
        if math.fabs(z) > 2:
            return False
    return True

def pixel(image,x,y,r,g,b):
   """Place pixel at pos=(x,y) on image, with color=(r,g,b)"""
   image.put("#%02x%02x%02x" % (r,g,b), (y, x))

#here's some example coloring code that may help:
def draw(grid):
    #Create a white image with the size of the grid as the number of pixels
    img = Image.new('RGB', (len(grid), len(grid)), "white")
    pixels = img.load()
    for row in xrange(len(grid)):
        for col in xrange(len(grid[row])):
            if grid[row][col] == True:
                #If that point is True (it's in the set), color it blue
                pixels[row, col] = (0, 0, 255)
    return img

def mandelbrot():
    #you should probably use a square, it's easier to deal with
    #The mandelbrot set fits completely within (-2, 2) and (2, -2)
    #(-200, 200), (200, -200) is way too big!
    TopLeftX = -2; BottomRightX = 2
    TopLeftY = 2; BottomRightY = -2
    #increment should be calculated based on the size of the bounds and the number of pixels
    #For example, if you're between -2 and 2 on the X-Plane, and your image is 400 pixels wide
    #Then your increment = (2 - (-2)) / 400 = 4 / 400 = .01 so that each pixel is 1/400th of the
    #Total width of the bounding area
    increment = 0.01
    maxIt = 100
    w = BottomRightX - TopLeftX
    h = TopLeftY - BottomRightY
    #This should be based on the size of the image, one spot in the area for one pixel
    npArr = np.zeros((w / increment, h / increment), dtype=bool)
    #Use the increment variable from above. It won't work with xrange because that doesn't
    #Support decimals. You probably want to use a while loop or something
    x = -2
    y = 2
    while TopLeftX <= x <= BottomRightX:
        while TopLeftY <= y <= BottomRightY:
            #I recommend using True or False in here (in the set or not)
            #And then do your color calculations as I explained above
            #Saves a lot of memory
            if iterate(x, y, maxIt):
                npArr[x, y] = True
            y += increment
    #once you've calculated the Trues and Falses, you'd call the draw() function
    #using the npArr as the parameter. I haven't tested the code, so there may
    #be a few bugs, but it should be helpful!
        x += increment
    return npArr

img = draw(mandelbrot())
img.save("mandelbrot.png")

我怀疑问题出在&#34;迭代&#34;函数在我的代码中,因为我在iterate中放入的值都没有返回true。

修改    我还有另外一个问题,我在这里的第二个循环甚至没有运行。

1 个答案:

答案 0 :(得分:0)

您对y坐标的处理有误。你用

开始外循环
y = 2

并将循环条件设为

while TopLeftY <= y <= BottomRightY:

在替换它们的值之后,这是

while 2 <= y <= -2:

这是胡说八道。接下来是

y += increment    

y已位于该范围的最高端。此外,您无法为每个内循环重置y

总结一下,循环应该是

x = TopLeftX                                # use the value you already defined!
while TopLeftX <= x <= BottomRightX:
    y = TopLeftY                            # moved to inside x loop
    while TopLeftY >= y >= BottomRightY:    # change the loop condition
        # ... the Mandelbrot iteration
        y -= increment                      # reverse direction
    x += increment

我不是Python专家,所以也可能存在其他问题。