为什么龟可以点亮像素?

时间:2012-02-11 17:17:19

标签: python mandelbrot turtle-graphics

我创建Mandelbrot集的程序有一个错误:每当笔改变颜色时,每隔42个像素就会变亮。这是一个非常巧合的mandelbug(是的,我刚刚学过这个术语),因为它对于“边缘”附近的许多像素是不一致的(它实际上可能在它应该是的颜色和最后一个颜色之间模糊,或者接下来,像素应该是),但它总是在那之后的第42个像素,直到下一个颜色变化。我使用的是OSX 10.6.8,PYTHON 2.7。当我在学校写这个程序时,它完美地工作(Windows),然后我把它发送给自己,并且更多地工作(大多只是制作样本大小,因此图像更大),然后运行它,我得到了这个错误。编辑:我的不好,我忘了提到这只发生在我的Mandelbrot程序中,我家里的其他一些海龟程序都很好。

部分屏幕截图(这样您无需在程序运行时永远等待,看看我在说什么):

从我家的第一个版本开始:

I mean, just what?

从当前版本(侧面):

Please Note: this image is sideways

下面是代码:

import turtle
import math
turtle.speed(0)
def benoit(onelen):
    turtle.left(90)
    for x in range(-2*onelen, onelen):
        turtle.up()
        turtle.goto(x, int(-1.5*onelen)-1)
        turtle.down()
        for y in range(int(-1.5*onelen)-1, int(1.5*onelen)-1):
            z = complex(0,0)
            c = complex(x*1.0/onelen,y*1.0/onelen)
            for k in range(20):
                z = z*z+c
                if abs(z) > 2:
                    g = .2 + .8*(20-k)/20
                    break
                if k == 19:
                    g = 0
            turtle.pencolor(0,g,0)
            turtle.forward(1)
benoit(250)
x = raw_input("Press Enter to Exityadayadayada")

编辑:DSM建议修复,他喜欢这个bug。但是,我没有编辑Python源代码的经验,所有下划线都让我感到紧张。有人能告诉我具体的编辑内容和/或方式吗?

2 个答案:

答案 0 :(得分:7)

哇。我认为这是我最喜欢的错误之一,不管你信不信,这个数字恰好是42的事实实际上是相关的!嗯,外围,无论如何...... 在turtle.py中:

   def _goto(self, end):
        """Move the pen to the point end, thereby drawing a line
        if pen is down. All other methodes for turtle movement depend
        on this one.

[...]

    ######    vererbung!!!!!!!!!!!!!!!!!!!!!!
    self._position = end
    if self._creatingPoly:
        self._poly.append(end)
    if len(self.currentLine) > 42: # 42! answer to the ultimate question
                                   # of life, the universe and everything
        self._newLine()
    self._update() #count=True)

所以问题出现在它决定打破一条线时,显然是出于性能原因:

def _newLine(self, usePos=True):
    """Closes current line item and starts a new one.                                              
       Remark: if current line became too long, animation                                          
       performance (via _drawline) slowed down considerably.                                       
    """

我能够通过提高亚麻布限制和/或在没有任何地方的地方散布self._pencolor参考来“修复”这个错误。但无论如何,你并不疯狂,这并不是你正在做的任何事情。 : - )

答案 1 :(得分:1)

我可以提出建议吗?

我尝试了你的代码,你需要知道的是永远的运行,但你可能不知道的是跟踪器功能...我只是简单地放在代码的开头:

 wn=turtle.Screen()
 wn.tracer(10000)

也消除了对速度(0)功能的需要:)

尝试并再次运行它,我做了,它在62秒内呈现整个图像,我通过将此代码放在开头导入时间模块来计时:

 import time
 st=time.time()

以及最后的代码:

 print time.time()-st

顺便说一下,我刚刚制作了自己的那个比你的更慢和更低的质量但是使用了方形的阵列并且在我想要的阵列中加盖了lol,但是会尝试改进它在未来,因为我发现龟不到一周前存在。

最后一件事,如果你输入:

 from turtle import *

而不是“import turtle”你不需要在每个函数调用的开头放乌龟:)同样的事情适用于每个其他模块。

我已经将你的分形图片包含在我的机器上需要62秒才能渲染,甚至不是那么强大的Your code run on my weak machine

我希望这一切对你有很大帮助。另外你会注意到我没有那个轻行问题,不确定你是否修复了原始代码中的问题?