2011-09-27 238 views
2

我创建了一个程序中使用龟图形绘制dragon curve ..但我的结果并没有真正看起来像图片确实在链接:龙曲线在Python

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

回答

4

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

谢谢,我明白你的意思..但就是为什么我的画面是如此愁容满面的唯一原因,我认为印“字解“,然后将它用作drawit中的参数将导致与使用变量相同的结果 – mdegges

+0

@Michele'我不确定问题出在我的createWord函数上,还是我只是在drawit中没有”充分绘制“ 。这几乎肯定是问题 - 你的龙的曲线只是一个婴儿!它看起来像[这个](http://upload.wikimedia.org/wikipedia/commons/9/97/Dragon_curve_iterations_%282%29.svg) 。尝试传递一个更长的字符串到drawit()。 –

+0

我能弄明白!我传递的只是一个字符串,当它应该被传递给我的createWord()函数中的字符时调用。它只需要2行来解决! Arrrgh – mdegges