2016-03-26 4 views
0

私はここで見つけるフラクタル再作成するためにはPython 3でカメモジュールを使用しようとしました: https://en.wikipedia.org/wiki/L-system#Example_7:_Fractal_plant を私はそれをしようとするたびに、それは私に非常に奇妙な結果を与える...奇妙なL-システム

私のコードは次のとおりです:

import turtle 
wn = turtle.Screen() 
wn.bgcolor("white") 
wn.screensize(10000, 10000) 

tess = turtle.Turtle() 
tess.color("lightgreen") 
tess.pensize(1) 
tess.speed(0) 
tess.degrees() 

inst = 'X' 
steps = 3 

for counter in range(steps): 
    _inst = '' 
    for chtr in inst: 
     if chtr == 'X': 
      _inst += 'F−[[X]+X]+F[+FX]−X' 
     elif chtr == 'F': 
      _inst += 'FF' 
     else: 
      _inst += chtr 
    inst = _inst 
    print(inst) 


for chtr in inst: 
    if (chtr == 'F'): 
     tess.forward(25) 
    elif (chtr == '+'): 
     tess.right(25) 
    elif (chtr == '-'): 
     tess.left(25) 
    elif (chtr == '['): 
     angle = tess.heading() 
     pos = [tess.xcor(), tess.ycor()] 
    elif (chtr == ']'): 
     tess.setheading(angle) 
     tess.penup() 
     tess.goto(pos[0], pos[1]) 
     tess.pendown() 
wn.exitonclick() 

私はすべてを3回チェックしましたが、私はバグはありませんが、それでも動作しません。私は何がひどく間違っているのですか?

ありがとうございました!

答えて

1

コードには2つの問題があります。

最初に、コードでネストされた角括弧を正しく処理できないことがあります。内側開口ブラケットは、外側開口ブラケットが見えるときに保存された以前の状態の上にその状態を保存する。 [[X]+X]のようにすぐにネストされた括弧は問題ではありませんが(どちらも同じ開始状態を持っているので)、一度複雑なネスティングが行われると、いくつかの置換ループの後で問題が発生します。

この問題を解決するには、保存された状態値をスタックに保存することが望ましいでしょう(list)。保存する値をプッシュし、復元する準備ができたらポップします。

stack = [] # use a list for the stack 
for chtr in inst: 
    if (chtr == 'F'): 
     tess.forward(25) 
    elif (chtr == '+'): 
     tess.right(25) 
    elif (chtr == '-'): 
     tess.left(25) 
    elif (chtr == '['): 
     angle = tess.heading() 
     pos = [tess.xcor(), tess.ycor()] 
     stack.append((angle, pos)) # push state to save 
    elif (chtr == ']'): 
     angle, pos = stack.pop() # pop state to restore 
     tess.setheading(angle) 
     tess.penup() 
     tess.goto(pos[0], pos[1]) 
     tess.pendown() 

2番目の問題は、より簡単です。あなたのパーサは "マイナス"文字(-)を探します。しかし、パターンを生成するコードでは、多少長いダッシュ()を使います。それらのうちの1つを他のものと一致するように変更します(実際にどちらのコードでも問題はありません)。コードが期待通りに機能します。

+0

@Blcknght、ありがとうございます!なんらかの理由で、wiki上では、 ''は現在の角度と位置を保存して、以前のすべての保存を無効にすることを意味します。しかし、今働く! –

1

ウィキペディアのページによると、 '['は現在の状態(角度の位置)を保存することを意味します。一致する ']'は、以前に保存された位置を復元することを意味します。 '['と ']'はネストすることができるので、スタックが必要です。

from collections import deque 

... 

stack = deque() 

for chtr in inst: 
    if (chtr == 'F'): 
     tess.forward(25) 

    elif (chtr == '+'): 
     tess.right(25) 

    elif (chtr == '-'): 
     tess.left(25) 

    elif (chtr == '['): 
     angle = tess.heading() 
     pos = [tess.xcor(), tess.ycor()] 
     stack.append((angle, pos))   ### New statement 

    elif (chtr == ']'): 
     angle, pos = stack.pop()   ### New statement 
     tess.setheading(angle) 
     tess.penup() 
     tess.goto(pos[0], pos[1]) 
     tess.pendown() 

. . .