python – Mandelbrot设置显示不正确

前端之家收集整理的这篇文章主要介绍了python – Mandelbrot设置显示不正确前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我尝试使用Pygame模块对 Python 3.5中的Mandelbrot集进行编程.
import math,pygame
pygame.init()

def mapMandelbrot(c,r,dim,xRange,yRange):
    x = (dim-c)/dim
    y = (dim-r)/dim
    #print([x,y])
    x = x*(xRange[1]-xRange[0])
    y = y*(yRange[1]-yRange[0])
    x = xRange[0] + x
    y = yRange[0] + y
    return [x,y]

def checkDrawBox(surface):
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            pygame.quit()
        elif i.type == pygame.MOUSEBUTTONDOWN:
            startXY = pygame.mouse.get_pos()
            BoxExit = False
            while BoxExit == False:
                for event in pygame.event.get():
                    if event.type == pygame.MOUSEBUTTONUP:
                        BoxExit = True
                if BoxExit == True:
                    return [startXY,pygame.mouse.get_pos()]
                pygame.draw.rect(surface,[255,0],[startXY,[pygame.mouse.get_pos()[0]-startXY[0],pygame.mouse.get_pos()[1]-startXY[1]]],1)
                pygame.display.update()

def setup():
    dimensions = 500
    white = [255,255,255]
    black = [0,0]
    checkIterations = 100
    canvas = pygame.display.set_mode([dimensions,dimensions])
    canvas.fill(black)
    xRange = [-2,2]
    yRange = [-2,2]
    xRangePrev = [0,0]
    yRangePrev = [0,0]
    newxRange = [0,0]
    newyRange = [0,0]
    while True:
        if not ([xRange,yRange] == [xRangePrev,yRangePrev]):
            draw(dimensions,canvas,yRange,checkIterations)
            pygame.display.update()
            xRangePrev = xRange
            yRangePrev = yRange
        Box = checkDrawBox(canvas)
        if Box != None:
            maxX = max([Box[0][0],Box[1][0]])
            maxY = max([Box[0][1],Box[1][1]])
            newxRange[0] = mapMandelbrot(Box[0][0],dimensions,yRange)[0]
            newxRange[1] = mapMandelbrot(Box[1][0],yRange)[0]
            newyRange[0] = mapMandelbrot(0,Box[0][1],yRange)[1]
            newyRange[1] = mapMandelbrot(0,Box[1][1],yRange)[1]
            xRange = newxRange
            yRange = newyRange

def draw(dim,surface,checkIterations):
    for column in range(dim):
        for row in range(dim):
            greyVal = iteration(0,mapMandelbrot(column,row,yRange),checkIterations,checkIterations)    
            surface.set_at([dim-column,row],greyVal)

def iteration(a,b,c,iterCount,maxIter):
    a = (a*a) - (b*b) + c[0]
    b = (2*a*b) + c[1]
    iterCount = iterCount - 1
    if iterCount == 0:
        return [0,0]
    elif abs(a+b) > 17:
        b = (iterCount/maxIter)*255
        return [b,b]
    else:
        return iteration(a,maxIter)


setup()

我相信迭代算法是正确的,但输出看起来不正确:

想知道可能是什么问题?很抱歉代码转储,只是不确定哪个部分可能会导致它看起来像那样.

解决方法

迷人的bug – 它看起来像一个被压扁的bug

猜你在找的Python相关文章