Mandelbrot序列与Python的乌龟

时间:2017-12-06 04:11:24

标签: python oop turtle-graphics fractals mandelbrot

我正在尝试用python的乌龟图形绘制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]

另一个类代表乌龟展示。

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

2 个答案:

答案 0 :(得分:2)

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

enter image description here

所以这可能是Python龟或Tkinter实现特定的。 (将您的系统详细信息添加到您的问题中或作为评论后添加。)

然而,我会解决几个不相关的问题。首先,为您绘制的每个点创建一个新的Mandelbrot实例 - 您只需要根据需要调用一个实例:

tracer()

您的主程序已修订为使用此mandelbrot.py,并稍微更改了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() 逻辑:

from datetime import datetime

class Customer(models.Model):
last_updated = models.DateTimeField(auto_now_add=True)
#...some more code...
    @property
    def is_past_due(self):
        return (datetime.now(timezone.utc) - self.last_updated).days>1

第二个问题是,如果你看一下我上面生成的图像,你会看到它上面有轻微的曲线。您可能会也可能不会遇到这些,这取决于您使用的系统。如果你确实得到了这些,或者只是想了解它们,请参阅:

答案 1 :(得分:2)

我在Linux Mint上遇到同样的问题,但是我看到它会绘制上半部分,之后会删除它。

问题是因为当下一栏中乌龟从上到下移动时goto(x,y)绘制白线 - 即。从(0, 150)(1, -150) - 此行会删除部分图片。

您必须手动移动它而不绘制线

    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)

        # move to bottom in next column without creating white line
        self.t.up()
        self.t.goto(x+1, -150)
        self.t.down()

或者在开始每一个新专栏之前移动它

    for x in range(-150, 151):
        # move to bottom without creating white line
        self.t.up()
        self.t.goto(x, -150)
        self.t.down()

        for y in range(-150, 151):
            self.t.color(Mandelbrot(turtleConvert(x,y)).getColor())
            self.t.goto(x,y)