gpt4 book ai didi

python - Mandelbrot 集显示不正确

转载 作者:太空狗 更新时间:2023-10-29 22:18:07 24 4
gpt4 key购买 nike

这是我尝试使用 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,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,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, xRange, 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],0,dimensions,xRange,yRange)[0]
newxRange[1] = mapMandelbrot(box[1][0],0,dimensions,xRange,yRange)[0]
newyRange[0] = mapMandelbrot(0,box[0][1],dimensions,xRange,yRange)[1]
newyRange[1] = mapMandelbrot(0,box[1][1],dimensions,xRange,yRange)[1]
xRange = newxRange
yRange = newyRange

def draw(dim, surface, xRange, yRange, checkIterations):
for column in range(dim):
for row in range(dim):
greyVal = iteration(0,0,mapMandelbrot(column,row,dim,xRange,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,0]
elif abs(a+b) > 17:
b = (iterCount/maxIter)*255
return [b,b,b]
else:
return iteration(a,b,c,iterCount,maxIter)


setup()

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

enter image description here

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

最佳答案

令人着迷的错误——它看起来就像一个被压扁的错误 :)

问题出在两行:

a = (a*a) - (b*b) + c[0]
b = (2*a*b) + c[1]

您在第一行中更改了 a 的含义,因此在第二行中使用了错误的 a

修复很简单:

a, b  = (a*a) - (b*b) + c[0], (2*a*b) + c[1]

这将导致在计算右侧时使用相同的 a 值。

弄清楚你的错误产生了什么会很有趣。尽管它不是 Mandelbrot 集,但它本身似乎是一个有趣的分形。从这个意义上说,你有一个非常幸运的错误。 99% 的时间,bug 会导致垃圾,但有时它们会产生一些非常有趣的东西,但只是出乎意料。

编辑时:

Mandelbrot 集基于迭代复数多项式:

f(z) = z^2 + c

这个bug产生的伪Mandelbrot集是基于迭代函数

f(z) = Re(z^2 + c) + i*[2*Re(z^2 + c)*Im(z) + Im(c)]

其中 Re()Im() 是提取复数的实部和虚部的运算符。这不是 z 中的多项式,尽管很容易看出它是 z,z* 中的多项式(其中 z*z 的复共轭)。由于这是一个相当自然的错误,几乎可以肯定它已经出现在关于 Mandelbrot 集的文献中的某个地方,尽管我不记得曾经见过它。

关于python - Mandelbrot 集显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42047993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com