2012-02-18 45 views
1

我需要弄清楚如何控制tu.py.py中的self._newline()。在我的Python Mandelbrot套装程序中,当我开始做奇怪的事情时,我发现了这件事;有关更多详细信息,请参阅Why is turtle lightening pixels?。但是,当我试图制作一个极其类似的程序来绘制复数的切线时,同样的事情也没有发生......但是随着时间的推移,程序显着减速。如何控制龟的self._newline()?

基本上,我问3个问题:

是什么这些程序导致这种差异的区别? (智力询问)

如何激活/停止self._newline()? (必要的,主要问题)

如何保持self._newline()不会导致颜色偏差(DSM建议我将self._pencolor()引用插入到turtle.py中,但我不知道如何执行此操作) ? (不需要,但希望)

即使你没有回答中间的问题,你的输入仍将不胜感激!

复杂的切线代码:

import turtle 
import math 
import cmath 
turtle.speed(0) 
def bengant(size, onelen): 
    turtle.left(90) 
    for x in range(-size*onelen, size*onelen+1): 
     turtle.up() 
     turtle.goto(x, -size*onelen-1) 
     turtle.down() 
     for y in range(-size*onelen, size*onelen+1): 
      c = complex(x*1.0/onelen,y*1.0/onelen) 
      k = cmath.tan(c) 
      turtle.pencolor(0,math.atan(k.real)/math.pi+1/2,math.atan(k.imag)/math.pi+1/2) 
      turtle.forward(1) 
bengant(2,100) 
x = raw_input("Press Enter to Exit") 

回答

0

如何激活/停止self._newline()? (必要的,主要的问题)

使用penup/pendown分别停止/启动self.__newline

参考

+0

我试过这种方法与' benoit()'上面的例子,它可以有效地消除这个问题。但是,我发现如果你不小心,它也会产生额外的行文物和/或严重影响你的代码的性能。我很好奇,看到你使用这种技术修复了有问题的代码。 – cdlane 2017-07-20 03:30:32

0

的是这之间的区别导致此 差异的程序?

问题发生在您的bengant()程序中不常出现的长单色线条上。如果我使其更加单色(即通过0作为第三彩三合一而不是math.atan(k.imag)/math.pi + 1/2)这一次露面:

enter image description here

插桩Python的龟库确认你打在这些点的优化子句。

如何激活/停止self._newline()?

你不知道。问题不是这种优化存在,问题是它的实现有问题。但正如您在最新的bengant()计划中看到的那样,当涉及更多复杂性时,它会消失。用正确的例子向适当的人提供错误报告。

如何避免self._newline()导致颜色偏差?

至于你benoit()代码的话,你可以有效地利用1.5而不是默认的1线宽消除它,它似乎不影响图像质量太多:

enter image description here

这是左边的1.0,右边的1.5。但是,您的每42像素的行将消失。另一种方法是在颜色值中添加一些随机噪声(小部分添加),这些颜色值不会直接影响人的视觉效果,但可以避免引发麻烦的优化。

这里是我此修复程序和一些速度优化您的benoit()代码重写:

import turtle 

def benoit(onelen): 
    turtle.tracer(False) 
    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) 
      g = 0 

      for k in range(20): 
       z = z * z + c 
       if abs(z) > 2: 
        g = 0.2 + 0.8 * (20 - k)/20 
        break 

      turtle.pencolor(0, g, 0) 
      turtle.forward(1) 

     turtle.update() 

    turtle.tracer(True) 

turtle.setup(1000, 750) 
turtle.hideturtle() 
turtle.setundobuffer(None) 
turtle.pensize(1.5) # work around for "42" glitch 

benoit(250) 

turtle.exitonclick() 

这是我沿着类似的路线你bengant()代码重写:

import math 
import cmath 
import turtle 

def bengant(size, onelen): 
    turtle.tracer(False) 

    turtle.left(90) 

    size_onelen = size * onelen 

    for x in range(-size_onelen, size_onelen + 1): 
     turtle.up() 
     turtle.goto(x, -size_onelen - 1) 
     turtle.down() 

     for y in range(-size_onelen, size_onelen + 1): 
      c = complex(x * 1.0/onelen, y * 1.0/onelen) 
      k = cmath.tan(c) 
      turtle.pencolor(0, math.atan(k.real)/math.pi + 1/2, math.atan(k.imag)/math.pi + 1/2) 
      turtle.forward(1) 

     turtle.update() 

    turtle.tracer(True) 

turtle.hideturtle() 

bengant(2, 100) 

turtle.exitonclick()