Какая разница между этими программами, которая вызывает это
несоответствие?
Проблема возникает с длинными монохроматическими линиями, которые встречаются недостаточно часто в вашей программе bengant()
. Если я сделаю его более монохромным (то есть передадим 0 в качестве тройки третьего цвета вместо math.atan(k.imag) / math.pi + 1/2
), то появится:
Инструментарий библиотеки черепах Python подтверждает, что вы попали в пункт оптимизации в этих точках.
Как мне активировать / остановить self._newline ()?
Вы не делаете. Проблема не в том, что эта оптимизация существует, проблема в том, что в ее реализации что-то не так. Но, как вы можете видеть в вашей последней программе bengant()
, она исчезает, когда возникает большая сложность. Возможно сообщение об ошибке нужным людям с правильным примером.
Как уберечь self._newline () от цветовых отклонений?
Что касается вашего benoit()
кода, вы можете эффективно устранить его, используя ширину линии 1,5 вместо значения по умолчанию 1. Похоже, он не слишком сильно влияет на качество изображения:
Это 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()