我正在尝试用 python 的 turtle 图形绘制 mandelbrot 序列。我正在使用两个类,一个用于表示 mandelbrot 序列。
class Mandelbrot:
def __init__(self,c,limit=50):
self.__limit = int(limit)
self.__colormap = ['black','white']
self.__cardinality = limit
z = 0
for i in range(limit):
z = z * z + c
if abs(z) > 2:
self.__cardinality = i
return
def getColor(self):
if self.__cardinality == self.__limit:
return self.__colormap[0]
return self.__colormap[1]
另一个类代表 turtle 显示。
import turtle
from mandelbrot import *
class Display:
def __init__(self):
self.t = turtle.Turtle()
self.t.ht();self.t.turtlesize(1)
self.t.speed(0)
turtle.tracer(2000,0)
for x in range(-150,151):
for y in range(-150,151):
self.t.color(Mandelbrot(turtleConvert(x,y)).getColor())
self.t.goto(x,y)
def turtleConvert(x,y): #converts from turtle pixels to the complex plane
return complex((x/300)*4,(y/300)*4)
当我创建显示类的实例时,程序运行但只打印分形的下半部分。谁能提供解决方案?
这是我的结果的图片。
最佳答案
在我的系统 (OSX) 上,您的程序会生成整个分形:
所以这可能是特定于 Python turtle 或 Tkinter 实现的。 (将您的系统详细信息添加到您的问题中或作为其后的评论。)
不过,我将解决几个不相关的问题。首先,您为绘制的每个点创建一个新的 Mandelbrot 实例——您只需要一个根据需要调用的实例:
class Mandelbrot:
def __init__(self, limit=50):
self.__limit = int(limit)
self.__colormap = ['black', 'white']
self.__cardinality = self.__limit
def computeCardinality(self, c):
z = 0
self.__cardinality = self.__limit
for i in range(self.__limit):
z = z * z + c
if abs(z) > 2:
self.__cardinality = i
return
def getColor(self):
if self.__cardinality == self.__limit:
return self.__colormap[0]
return self.__colormap[1]
您的主程序修改为使用此 mandelbrot.py,并稍微更改您的 tracer()
逻辑:
from turtle import Turtle, Screen
from mandelbrot import *
class Display:
def __init__(self, screen):
self.t = Turtle(visible=False)
self.t.speed('fastest')
screen.tracer(0)
mandelbrot = Mandelbrot()
for x in range(-150, 151):
for y in range(-150, 151):
mandelbrot.computeCardinality(turtleConvert(x, y))
self.t.color(mandelbrot.getColor())
self.t.goto(x, y)
screen.update()
screen.tracer(1)
def turtleConvert(x, y): # converts from turtle pixels to the complex plane
return complex(x / 75, y / 75)
screen = Screen()
dummy = Display(screen)
screen.mainloop()
第二个问题是,如果您查看我上面生成的图像,您会看到上面有轻微的曲线。您可能会或可能不会遇到这些,这同样取决于您使用的系统。如果您确实得到了这些,或者只是想了解它们,请参阅:
关于python - Mandelbrot 序列与 Python 的 Turtle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47666654/