Кривая Дракона в Python Заказать 10
Почему моя кривая Дракона не похожа на кривую дракона?
Вот реализация в python с порядком 10:
def setupForDragonCurve():
turtle.hideturtle()
turtle.tracer(1e3, 0)
turtle.penup()
turtle.goto(0, -turtle.window_height()/5)
turtle.pendown()
def generateDragonCurve(n, result='[FX]'):
for _ in range(n):
result = result.replace('Y', 'FX-Y')
result = result.replace('X', 'X+YF')
return result
def drawDragonCurve(cmds, size):
stack = []
for cmd in cmds:
if cmd=='F':
turtle.forward(size)
elif cmd=='-':
turtle.left(90)
elif cmd=='+':
turtle.right(90)
elif cmd=='X':
pass
elif cmd=='Y':
pass
elif cmd=='[':
stack.append((turtle.position(), turtle.heading()))
elif cmd==']':
position, heading = stack.pop()
turtle.penup()
turtle.setposition(position)
turtle.setheading(heading)
turtle.pendown()
else:
raise ValueError('Unknown Cmd: {}'.format(ord(cmd)))
turtle.update()
Вот как должен выглядеть порядок 10:
РЕДАКТИРОВАТЬ: Вот то, что я получаю с 1-го порядка, с большей масштабированной кривой:
1 ответ
Когда ты бежишь
result = result.replace('Y', 'FX-Y')
result = result.replace('X', 'X+YF')
вторая строка заменяет X
s введены в первой строке. (Кроме того, вы используете неправильные правила замены, но, похоже, вы это уже заметили.)
Вы должны выполнять эти замены таким образом, чтобы они не взаимодействовали друг с другом, возможно, выполняя их в комбинированном режиме. Один из способов сделать это - использовать более продвинутые возможности замены re
модуль. Еще бы написать свою собственную программу замены. Вы также можете использовать другой символ, кроме X
в первой замене, поэтому вторая замена не поднимает его, затем замените этот символ на X
в третьем проходе.