7

我创建 Mandelbrot 集的程序有一个错误:每当笔改变颜色时,之后每 42 个像素都会变亮。巧合的是,这是一个曼德尔虫(是的,我刚刚学会了这个术语),因为它对于“边缘”附近的许多像素是不一致的(它实际上可能在它应该是的颜色和最后的颜色之间模糊,或者接下来,像素应该是),但它始终是该像素之后的第 42 个像素,直到下一次颜色变化。我正在使用 OSX 10.6.8、PYTHON 2.7。当我在学校编写这个程序时,它运行良好(Windows),然后我将它发送给自己,并对其进行了更多工作(主要只是使样本大小和图像更大),然后运行它,我得到了这个漏洞。编辑:我的错,我忘了提到这只发生在我的 Mandelbrot 程序中,

部分截图(这样您就不必在程序运行时一直等待才能看到我在说什么):

从我在家的第一个版本:

我的意思是,只是什么?

从当前版本(横向):

请注意:此图像是横向的

继承人的代码:

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 建议修复,他喜欢这个错误。但是,我没有编辑 Python 源代码的经验,所有的下划线都让我感到紧张。有人可以具体告诉我要编辑什么和/或如何编辑吗?

4

2 回答 2

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.                                       
    """

我能够通过提高 linenumber 限制和/或在没有任何地方的地方分散 self._pencolor 引用来“修复”该错误。但无论如何,你并没有疯,而且这并不是你正在做的任何事情。:-)

于 2012-02-11T18:30:02.867 回答
1

我可以提供一个建议吗?

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

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

这也消除了对 speed(0) 函数的需要:)

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

 import time
 st=time.time()

最后是这段代码:

 print time.time()-st

顺便说一句,我做得很好,我自己做的比你的要慢得多,质量也低,但是使用的是方形阵列,并在阵列中我想要的每个位置进行冲压,哈哈,但会努力改进它未来,因为我只发现乌龟的存在少于一周前。

最后一件事,如果您键入:

 from turtle import *

而不是“导入海龟”,您不需要在每个函数调用的开头放置海龟 :) 对于每个其他模块也是如此。

我已经包含了你的分形图片,它在我的机器上渲染了 62 秒,这甚至没有那么强大你的代码在我的弱机器上运行

我希望这一切对你有很大帮助。你也会注意到我没有那个灯线问题,不确定你是否在顶部的原始代码中解决了这个问题?

于 2016-03-07T18:06:44.230 回答