小能豆

我如何控制 turtle 的 self._newline()?

py

我需要弄清楚如何控制 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")

阅读 22

收藏
2025-01-06

共1个答案

小能豆

分析和解决方案

1. 关于程序行为的差异:

您的程序中使用 turtle 绘制 Mandelbrot 集,出现了 self._newline() 引发的奇怪现象。self._newline()turtle 模块内部的一个私有方法,可能与换行、更新画布或者其他与刷新和绘图状态有关的操作有关。

具体来说:
- turtle 模块中,绘图状态(例如画笔颜色、位置等)可能会因为内部状态更新而被改变,特别是在您频繁更改画笔颜色时。
- 在复杂的绘图过程中,例如计算 Mandelbrot 集时,每次调用 pencolor 会触发内部状态的更新。这个状态更新有可能调用了 self._newline(),从而导致绘图出现颜色偏差等问题。

2. 激活/停止 self._newline()

self._newline()turtle 内部方法,通常由模块本身的绘图逻辑触发。要解决这个问题,您需要避免直接或间接触发它。可以尝试以下方法:

  1. 使用单次绘图
    绘制 Mandelbrot 集时,可以尽量减少对 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”)
```

  1. 避免过多状态更新
    在原始代码中,每次调用 turtle.pencolor() 都可能触发状态更新。您可以缓存计算的颜色值,减少 pencolor() 调用次数。

3. 防止 self._newline() 导致颜色偏差:

为了解决颜色偏差问题,可以通过直接插入颜色缓存逻辑到 turtle.py 或在您的代码中实现类似功能:

  1. pencolor() 外部进行颜色计算:
  2. 预先计算颜色值,将它们存储在数组中,然后逐步应用。
  3. 避免每次调用 pencolor() 时触发状态更新。

示例代码:
```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()

bengant(2, 100)
input(“Press Enter to Exit”)
```

  1. 修改 turtle.py
    如果您愿意修改 turtle.py,可以尝试在 pencolor() 内部插入一个缓存机制,避免每次调用都更新画布状态。

总结:

通过优化绘图逻辑(减少 turtle.pencolorturtle.forward 的频繁调用)以及合理使用颜色缓存,您可以有效避免 self._newline() 引发的奇怪现象和颜色偏差。

2025-01-06