Восстановление записанного состояния в коде L-System с использованием графики черепах

StackOverflow https://stackoverflow.com/questions/6315399

Вопрос

Я использую графику черепах для воспроизведения L-Systems (библиотека 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()
Это было полезно?

Решение

Пара идей:

  • Ты никогда не устанавливаешь 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top