Я создал следующее дерево:
Но теперь я хочу, чтобы он был вертикальным, как это:
Для создания горизонтального я использовал следующий код:
from turtle import *
def tree(length,order):
if length < (length/order):
return
forward(length)
left(45)
tree(length * 0.5,length/order)
right(90)
tree(length * 0.5,length/order)
left(45)
backward(length)
return
tree (200, 5)
Теперь я пытаюсь создать его по вертикали с помощью следующего кода, но он застрял (я думаю) в строке справа (45):
def tree(length,order):
if length < (length/order):
return
rt(-90)
forward (length)
right(45)
tree(length * 0.5,length/order)
left(225)
tree(length * 0.5,length/order)
left(90)
backward(length)
return
tree (200,5)
import turtle
def tree(t,length,order):
if length < (length/order):
return
t.forward(length)
t.left(45)
tree(t,length * 0.5,length/order)
t.right(90)
tree(t,length * 0.5,length/order)
t.left(45)
t.backward(length)
return
screen = turtle.Screen ( )
tip = turtle.Turtle()
tip.shape ("turtle")
tip.speed (1)
tip.left(90) # vertical start
tree (tip, 200, 5)
Это может быть так же просто, как однострочное исправление:
mode('logo')
Среди прочего, режим 'logo'
меняет 0 градусов, чтобы быть ближе к верхней части экрана, а не вправо:
from turtle import *
def tree(length, order):
if length >= length / order:
forward(length)
left(45)
tree(length / 2, length / order)
right(90)
tree(length / 2, length / order)
left(45)
backward(length)
mode('logo')
tree(200, 5)
Эй смотри! Вот программа Recursion Tree, встроенная во встроенный пакет turtle
:
#!/usr/bin/env python3
""" turtle-example-suite:
tdemo_tree.py
Displays a 'breadth-first-tree' - in contrast
to the classical Logo tree drawing programs,
which use a depth-first-algorithm.
Uses:
(1) a tree-generator, where the drawing is
quasi the side-effect, whereas the generator
always yields None.
(2) Turtle-cloning: At each branching point
the current pen is cloned. So in the end
there are 1024 turtles.
"""
from turtle import Turtle, mainloop
from time import clock
def tree(plist, l, a, f):
""" plist is list of pens
l is length of branch
a is half of the angle between 2 branches
f is factor by which branch is shortened
from level to level."""
if l > 3:
lst = []
for p in plist:
p.forward(l)
q = p.clone()
p.left(a)
q.right(a)
lst.append(p)
lst.append(q)
for x in tree(lst, l*f, a, f):
yield None
def maketree():
p = Turtle()
p.setundobuffer(None)
p.hideturtle()
p.speed(0)
p.getscreen().tracer(30,0)
p.left(90)
p.penup()
p.forward(-210)
p.pendown()
t = tree([p], 200, 65, 0.6375)
for x in t:
pass
print(len(p.getscreen().turtles()))
def main():
a=clock()
maketree()
b=clock()
return "done: %.2f sec." % (b-a)
if __name__ == "__main__":
msg = main()
print(msg)
mainloop()
make_tree
:def maketree():
p = Turtle()
p.setundobuffer(None)
p.hideturtle()
p.speed(0)
p.getscreen().tracer(30,0)
p.left(90) # HERE! They turned left by 90 degrees!
p.penup()
p.forward(-210)
p.pendown()
t = tree([p], 200, 65, 0.6375)
for x in t:
pass
print(len(p.getscreen().turtles()))
Из этого встроенного файла tree.py
просто удалив некоторый код без добавления, вы можете получить:
from turtle import Turtle
def tree(plist, l, a, f):
if l > 3:
lst = []
for p in plist:
p.forward(l)
q = p.clone()
p.left(a)
q.right(a)
lst.append(p)
lst.append(q)
for x in tree(lst, l * f, a, f):
yield None
p = Turtle()
p.hideturtle()
p.getscreen().tracer(30,0)
p.left(90)
for x in tree([p], 120, 65, 0.6375):
pass
Выход:
Что отличается от описанного выше метода и вашего текущего метода, так это то, что мы видим, что каждый уровень ветвей растет в целом, вместо того, чтобы каждый раз ждать завершения одного маршрута.