Как я могу контролировать self._newline () черепахи?

1

Мне нужно выяснить, как управлять 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")
Теги:
debugging
turtle-graphics

2 ответа

0

В чем разница между этими программами, которые вызывают это несоответствие?

Проблема возникает с длинными монохроматическими линиями, которые часто не встречаются в вашей программе bengant(). Если я сделаю его более монохроматическим (т. math.atan(k.imag)/math.pi + 1/2 0 как третий цветовой тройной вместо math.atan(k.imag)/math.pi + 1/2), он появляется:

Изображение 174551

Инструментальная библиотека черепах Python подтверждает, что вы нажимаете предложение оптимизации в этих точках.

Как активировать/остановить self._newline()?

Вы этого не сделаете. Проблема заключается не в том, что такая оптимизация существует, проблема в ней что-то не так. Но, как вы можете видеть в своей последней программе bengant(), она исчезает, когда задействована большая сложность. Возможно, отчет об ошибках подходит людям с правильным примером.

Как сохранить self._newline() из-за отклонения цвета?

Что касается вашего benoit(), вы можете эффективно устранить его, используя ширину линии 1,5 вместо стандартного 1. Это, похоже, не слишком сильно влияет на качество изображения:

Изображение 174551

Это 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()
0

Как активировать/остановить self._newline()? (Необходимый, главный вопрос)

Используйте penup/pendown чтобы соответственно остановить/активировать self.__newline

Рекомендации

  • 0
    Я попробовал этот подход на benoit() выше, и он может эффективно устранить проблему. Но я обнаружил, что если вы не будете осторожны, это также может создать дополнительные линейные артефакты и / или сильно повлиять на производительность вашего кода. Мне было бы любопытно увидеть, как вы исправили этот код, используя эту технику.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню