【问题标题】:Dragon Curve in PythonPython中的龙曲线
【发布时间】:2011-11-25 15:22:25
【问题描述】:

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

我注意到的一个问题是我想将生成的字符串保存到变量 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()

【问题讨论】:

    标签: python turtle-graphics l-systems


    【解决方案1】:

    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()
    

    【讨论】:

    • 谢谢,我明白你的意思了.. 但这就是我的照片看起来如此悲伤的唯一原因吗?我认为打印“word”然后将其用作drawit中的参数会导致与使用变量相同的结果
    • @Michele I'm not sure if the problem is with my createWord function or if I'm just not 'drawing enough' in drawit. 这几乎肯定是问题所在——你的龙曲线还只是个婴儿!它看起来像this one。尝试将更长的字符串传递给 drawit()。
    • 我想通了!我只传递了一个字符串,当它应该传递单词并在我的 createWord() 函数中调用时。只需要 2 行就可以修复!啊
    • 恭喜! (= 现在你已经解决了,我将在我制定的解决方案中进行编辑;有趣的问题!顺便说一句,你介意投票还是选择我的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2019-12-26
    • 2018-03-19
    相关资源
    最近更新 更多