Кривая дракона в Python

Я создал программу для рисования кривой дракона, используя графику черепахи.. но мой результат на самом деле не похож на картинку в ссылке:

введите здесь описание изображения

Одна проблема, которую я заметил, заключается в том, что я хочу сохранить созданную строку в переменной newWord.. но я не могу использовать newWord в качестве параметра в моей функции drawit, которая фактически рисует линии на основе строки. Когда я пытаюсь это сделать, я получаю сообщение об ошибке «глобальная переменная newWord не определена». Поэтому в своем коде я просто скопировал вывод newWord для рисования, фактически не передавая переменную, которую хотел передать.

Я не уверен, связана ли проблема с моей функцией createWord или я просто «недостаточно рисую» в drawit.

import turtle

def createWord(max_it, axiom, proc_rules):

    word = axiom
    t = 1

    while (t < max_it):
        word = rewrite(word, proc_rules)
        t=t+1

    newWord = word

def rewrite(word, proc_rules):

    wordList = list(word)

    for i in range(len(wordList)):
        curChar = wordList[i]
        if curChar in proc_rules:
            wordList[i] = proc_rules[curChar]

    return "".join(wordList)

def drawit(newWord, d, angle):

    newWordLs = list(newWord)
    for i in range(len(newWordLs)):
        cur_Char = newWordLs[i]
        if cur_Char == 'F':
            turtle.forward(d)
        elif cur_Char == '+':
            turtle.right(angle)
        elif cur_Char == '-':
            turtle.left(angle)
        else:
            i = i+1

#sample test of dragon curve

def main():
    createWord(10, 'FX', {'X':'X+YF','Y':'FX-Y'})
    drawit('FX+YF+FX-YF+FX+YF-FX-YF+FX+YF+FX-YF-FX+YF-FX-YF', 20, 90)

if __name__=='__main__': main()

person mdegges    schedule 27.09.2011    source источник


Ответы (1)


newWord имеет локальную область действия внутри createWord(), поэтому после завершения createWord() newWord исчезает.

Рассмотрите возможность создания newWord в глобальной области видимости, чтобы вы могли изменять его с помощью createWord — или, что еще лучше, пусть createWord() возвращает значение и устанавливает newWord в это значение.

Я бы подумал, что печать «слова», а затем использование его в качестве параметра в drawit приведет к тому же результату, что и использование переменной.

Это так, но если вы хотите изменить длину кривой дракона, вам придется каждый раз копировать/вставлять строку вместо простого изменения значения max_it.

Изменить: мое решение с некоторой сексуальной рекурсией (=

import turtle

def dragon_build(turtle_string, n):
    """ Recursively builds a draw string. """
    """ defining f, +, -, as additional rules that don't do anything """
    rules = {'x':'x+yf', 'y':'fx-y','f':'f', '-':'-', '+':'+'}
    turtle_string = ''.join([rules[x] for x in turtle_string])
    if n > 1: return dragon_build(turtle_string, n-1)
    else: return turtle_string

def dragon_draw(size):
    """ Draws a Dragon Curve of length 'size'. """
    turtle_string = dragon_build('fx', size)
    for x in turtle_string:
        if x == 'f': turtle.forward(20)
        elif x == '+': turtle.right(90)
        elif x == '-': turtle.left(90)

def main():
    n = input("Size of Dragon Curve (int): ")
    dragon_draw(n)

if __name__ == '__main__': main()
person Cody Hess    schedule 29.09.2011
comment
Спасибо, я понимаю, что вы имеете в виду.. но это единственная причина, почему моя фотография такая грустная? Я бы подумал, что печать слова, а затем его использование в качестве параметра в drawit приведет к тому же результату, что и использование переменной. - person mdegges; 29.09.2011
comment
@Michele I'm not sure if the problem is with my createWord function or if I'm just not 'drawing enough' in drawit. Почти наверняка проблема в этом - твоя кривая дракона еще совсем маленькая! Похоже на вот этот. Попробуйте передать более длинную строку в drawit(). - person Cody Hess; 30.09.2011
comment
Я смог разобраться! Я передавал drawit только одну строку, когда она должна быть передана словом и вызвана в моей функции createWord(). На исправление ушло всего 2 строчки! Аррр - person mdegges; 30.09.2011
comment
Поздравляем! (= Теперь, когда вы решили это, я собираюсь отредактировать решение, которое я придумал; забавная проблема! Кстати, вы не против проголосовать или выбрать мой ответ? - person Cody Hess; 30.09.2011