Мне нужно выяснить, как управлять self._newline(), в turtle.py. Я узнал об этом во время моей программы установки 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")
В чем разница между этими программами, которые вызывают это несоответствие?
Проблема возникает с длинными монохроматическими линиями, которые часто не встречаются в вашей программе bengant()
. Если я сделаю его более монохроматическим (т. math.atan(k.imag)/math.pi + 1/2
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()
Как активировать/остановить self._newline()? (Необходимый, главный вопрос)
Используйте penup
/pendown
чтобы соответственно остановить/активировать self.__newline
Рекомендации
benoit()
выше, и он может эффективно устранить проблему. Но я обнаружил, что если вы не будете осторожны, это также может создать дополнительные линейные артефакты и / или сильно повлиять на производительность вашего кода. Мне было бы любопытно увидеть, как вы исправили этот код, используя эту технику.