Wiederherstellung des aufgezeichneten Zustands im L-System-Code mit Turtle-Grafiken
-
26-10-2019 - |
Frage
Ich verwende Turtle-Grafiken, um L-Systeme (Turtleworld Library) zu reproduzieren. Die Regeln, die ich versucht habe, die Arbeit zu bewerben, wenn sie nicht zu einem früheren gespeicherten Zustand zurückkehren, aber wenn es eine [und] (siehe Regel unten) gibt, brechen die Dinge und die Schildkröte zeichnet nur zufällige BS.
Grundsätzlich ist die IF -Aussage, die überprüft, wo '] vorhanden ist, der Code bricht, denke ich. (Außerdem weiß ich, dass es im Moment nicht optimiert ist, ich habe einen soliden wenn aus Claritys willen geschrieben ...)
Bearbeiten: Neues Code - Dieser gesamte Berechnungswinkel -Ding war nicht erforderlich, da wir Get_heading () haben, was uns über den Winkel informiert, in den wir ausgerichtet sind.
import turtle
turtle.down()
n = 'F'
s1 = 'F'
s2 = 'FF-[-F+F+F]+[+F-F-F]'
#s3 = 'F'
#s4 = 'FF'
steps = 5
for i in range(steps):
n = n.replace(s1,s2)
#n = n.replace(s3,s4)
a = 25
x = []
y = []
angle = []
for i in n:
if i == 'F':
turtle.forward(2)
if i == '+':
turtle.left(a)
if i == '-':
turtle.right(a)
if i=='[':
x.append(turtle.xcor())
y.append(turtle.ycor())
angle.append(turtle.heading())
if i==']':
turtle.pu()
turtle.setpos(x[len(x)-1],y[len(y)-1])
turtle.right(turtle.heading())
turtle.setheading(angle[len(angle)-1])
x.pop()
y.pop()
angle.pop()
turtle.pd()
Lösung
Ein paar Ideen:
- Du hast nie gesetzt
angle
zum neuen Winkel (newa
) in deiner]
-handler. - Ihre bedingte ist laut Kommentar falsch,
newa>0
würde es links drehen, wenn der Winkel positiv ist. - Bist du dir sicher
rt
Griff negative Winkel gut? - Sie können Ihren Code bei Verwendung erheblich vereinfachen
pop
Stattdessen und schob ein Tupel oder ein gewisses Such des Staates. - Ein Index von
-1
ist gleichlen(lst) - 1
.
Beispiel des pop
-Anregung:
>>> state = []
>>> angle = 90
>>> posx = 10
>>> posy = 15
>>> state.append((angle, posx, posy))
>>> angle = 40
>>> angle, posx, posy = state.pop()
>>> angle
90