python - Mandelbrot 序列与 Python 的 Turtle

标签 python oop turtle-graphics fractals mandelbrot

我正在尝试用 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)

当我创建显示类的实例时,程序运行但只打印分形的下半部分。谁能提供解决方案?

这是我的结果的图片。

Fractal

最佳答案

在我的系统 (OSX) 上,您的程序会生成整个分形:

enter image description here

所以这可能是特定于 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/

相关文章:

python - 测试一个类是否继承自另一个

python - 对于列表中的索引

ruby-on-rails - 在 rails 模型中覆盖 to_s ...可能吗?

javascript - 使用 selenium 检查 javascript 异常?

python - 无法使用具有实际名称的 flask 下载文件

php - 我应该还是不应该使用 getter 和 setter 方法?

python - 在模块和类之间进行选择

python - 使用 Python 生成方形分形

python - 如何使用 python 3 turtle 两次

python - 不明白此 AttributeError : '_Screen' object has no attribute 'setimage' 的原因