我需要弄清楚如何控制 turtle.py 中的 self._newline()。我在编写 python Mandelbrot 集程序时发现了这一点,当时它开始出现奇怪的现象;有关更多详细信息,
基本上,我问了 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")
您的程序中使用 turtle 绘制 Mandelbrot 集,出现了 self._newline() 引发的奇怪现象。self._newline() 是 turtle 模块内部的一个私有方法,可能与换行、更新画布或者其他与刷新和绘图状态有关的操作有关。
turtle
self._newline()
具体来说: - turtle 模块中,绘图状态(例如画笔颜色、位置等)可能会因为内部状态更新而被改变,特别是在您频繁更改画笔颜色时。 - 在复杂的绘图过程中,例如计算 Mandelbrot 集时,每次调用 pencolor 会触发内部状态的更新。这个状态更新有可能调用了 self._newline(),从而导致绘图出现颜色偏差等问题。
pencolor
self._newline() 是 turtle 内部方法,通常由模块本身的绘图逻辑触发。要解决这个问题,您需要避免直接或间接触发它。可以尝试以下方法:
pencolor()
forward()
turtle.goto()
改进后的代码: ```python import turtle import math import cmath
def bengant(size, onelen): turtle.speed(0) turtle.tracer(0) # 停止自动刷新 turtle.hideturtle() turtle.penup()
for x in range(-size * onelen, size * onelen + 1): for y in range(-size * onelen, size * onelen + 1): c = complex(x / onelen, y / onelen) k = cmath.tan(c) color = ( 0, math.atan(k.real) / math.pi + 0.5, math.atan(k.imag) / math.pi + 0.5, ) turtle.pencolor(color) turtle.goto(x, y) turtle.dot(1) # 绘制点而不是线 turtle.update() # 手动刷新
bengant(2, 100) input(“Press Enter to Exit”) ```
turtle.pencolor()
为了解决颜色偏差问题,可以通过直接插入颜色缓存逻辑到 turtle.py 或在您的代码中实现类似功能:
turtle.py
示例代码: ```python def calculate_colors(size, onelen): colors = {} for x in range(-size * onelen, size * onelen + 1): for y in range(-size * onelen, size * onelen + 1): c = complex(x / onelen, y / onelen) k = cmath.tan(c) colors[(x, y)] = ( 0, math.atan(k.real) / math.pi + 0.5, math.atan(k.imag) / math.pi + 0.5, ) return colors
def bengant(size, onelen): turtle.speed(0) turtle.tracer(0) turtle.hideturtle() colors = calculate_colors(size, onelen)
for (x, y), color in colors.items(): turtle.pencolor(color) turtle.goto(x, y) turtle.dot(1) turtle.update()
通过优化绘图逻辑(减少 turtle.pencolor 和 turtle.forward 的频繁调用)以及合理使用颜色缓存,您可以有效避免 self._newline() 引发的奇怪现象和颜色偏差。
turtle.pencolor
turtle.forward