восстановление записанного состояния в коде l-system с использованием черепашьей графики

Я использую черепаховую графику для воспроизведения L-систем (библиотека TurtleWorld). Правила, которые я пытался применить, хорошо работают, когда они не предполагают возврата к предыдущему сохраненному состоянию, но всякий раз, когда есть [ и ] (см. правило ниже), все ломается, и черепашка просто рисует случайные bs.

По сути, я думаю, что оператор 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()

person L-R    schedule 11.06.2011    source источник
comment
вы можете опустить len(*), так как x[-1] совпадает с x[len(x)-1]   -  person derekdreery    schedule 13.03.2012


Ответы (1)


Пара идей:

  • Вы никогда не устанавливаете angle в новый угол (newa) в своем ]-обработчике.
  • Согласно комментарию, ваше условное выражение неверно, 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
person Skurmedel    schedule 11.06.2011
comment
эй, спасибо за советы. 1) Я не устанавливаю угол на newa, так как я просто поворачиваю разницу с помощью «newa», так как я всегда поворачиваюсь в одном и том же градусе, когда нажимаю + и -... не уверен, что эта логика имеет смысл . Я добавил это в код, и никаких изменений. 2) Изменено условное, действительно! 3)да 4)Отлично, сохранил несколько строк... К сожалению, тот же результат. Одна очень странная вещь: у меня получаются 4-х сторонние формы, а не 6-ти (60 градусов должно получиться 6-ти гранные...), так что там точно что-то сломалось... - person L-R; 11.06.2011
comment
Обновил код новым решением... Я делал вещи намного сложнее, чем нужно - get_heading() был тем, что я искал! - person L-R; 13.06.2011