这是我尝试使用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