Как я могу контролировать self._newline () черепахи? - PullRequest
1 голос
/ 18 февраля 2012

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

Ответы [ 2 ]

0 голосов
/ 20 июля 2017

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

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

enter image description here

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

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

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

Как уберечь self._newline () от цветовых отклонений?

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

enter image description here

Это 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 голосов
/ 12 октября 2013

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

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

Ссылки

...