Python中的龙曲线

时间:2011-09-27 00:04:36

标签: python turtle-graphics l-systems

我创建了一个使用乌龟图形绘制dragon curve的程序..但我的结果看起来并不像链接中的图片那样:

enter image description here

我注意到的一个问题是我想将生成的字符串保存到变量newWord ..但是我不能在我的函数drawit中使用newWord作为参数,它实际上是根据字符串绘制线条。当我尝试这样做时,我得到错误“全局变量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()

1 个答案:

答案 0 :(得分:4)

newWord在createWord()内局部作用域,因此在createWord()完成后,newWord会消失。

考虑在全局范围内创建newWord,以便您可以使用createWord对其进行修改 - 或者更好的是,让createWord()返回一个值,并将newWord设置为该值。

  

我认为打印“word”然后将其用作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()