【问题标题】:Why is turtle lightening pixels?为什么乌龟会变亮像素?
【发布时间】:2012-03-03 18:37:17
【问题描述】:

我用于创建 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 源代码的经验,所有的下划线都让我感到紧张。有人可以具体告诉我要编辑什么和/或如何编辑吗?

【问题讨论】:

  • 在你的机器上运行这个需要多长时间?它永远在我身上。
  • 是的,我知道,它应该这样做;我在我的问题中指出了这一点。这就是我提供截图的原因;随意下载它们并仔细查看

标签: python mandelbrot turtle-graphics


【解决方案1】:

哇。我认为这是我最喜欢的错误之一,不管你信不信,这个数字恰好是 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 引用分散在没有任何位置的地方来“修复”该错误。但无论如何,你并不疯狂,而且这并不是你正在做的任何事情。 :-)

【讨论】:

  • 是的!我就知道!我知道这是一个搭便车指南参考!不知道性能部分或它来自哪里,尽管我认为它在某处的海龟源中。问题是,当我制作一个只画一条线的程序时,错误不会出现。有任何想法吗?另外,我如何放置 self._pencolor 参考?我是否只输入了 self._pencolor 的行? PS:这也是我现在最喜欢的bug。
【解决方案2】:

我可以提个建议吗?

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

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

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

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

 import time
 st=time.time()

最后是这段代码:

 print time.time()-st

顺便说一句,做得好,我刚刚制作了我自己的,比你的慢得多,质量也低,但使用的是正方形数组,并在数组中我想要的每个位置进行冲压,哈哈,但会努力改进它在未来,因为我只在不到一周前才发现乌龟存在。

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

 from turtle import *

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

我已经包含了你的分形图片,它在我的机器上渲染了 62 秒,这甚至没有那么强大Your code run on my weak machine

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多