Восстановление записанного состояния в коде l-системы с использованием графики черепахи
Я использую графику черепах для воспроизведения l-систем (библиотека TurtleWorld). Правила, которые я пытался применить, работают хорошо, когда они не предполагают возвращение к предыдущему сохраненному состоянию, но всякий раз, когда есть [и] (см. Правило ниже), вещи ломаются, и черепаха просто рисует случайные буквы.
По сути, оператор IF, который проверяет, где присутствует ']', - это то место, где код нарушается, я думаю. (Кроме того, я знаю, что это не оптимизировано на данный момент, я написал твердый IF для ясности...)
РЕДАКТИРОВАТЬ: Новый код - все это вычисление угла не было необходимым, так как у нас есть get_heading(), который сообщает нам угол, на который мы ориентируемся.
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()
1 ответ
Решение
Пара идей:
- Вы никогда не устанавливаете
angle
под новым углом (newa
) в вашем]
-handler. - Ваше условие неверно согласно комментарию,
newa>0
повернул бы его влево, если угол положительный. - Уверены ли вы
rt
хорошо справляется с отрицательными углами? - Вы могли бы значительно упростить свой код, если вы используете
pop
вместо этого, и толкнул кортеж или что-то вроде государства. - Индекс
-1
равноlen(lst) - 1
,
Пример pop
-предложение:
>>> state = []
>>> angle = 90
>>> posx = 10
>>> posy = 15
>>> state.append((angle, posx, posy))
>>> angle = 40
>>> angle, posx, posy = state.pop()
>>> angle
90