H Tree с использованием рекурсивного питона - PullRequest
0 голосов
/ 08 декабря 2018

Я пытался закодировать это, но это не работает, и я запутался.

Используйте рекурсию, чтобы нарисовать фрактал «H-Tree».

Фрактал H-Tree определяется следующим образом:

  1. Начните с буквы H. Три линии H имеют одинаковую длину, как показано на первом изображении,Это H-дерево порядка 0.
  2. Буква H имеет четыре конечные точки.Нарисуйте H по центру в каждой из четырех конечных точек, как показано на втором изображении.Эти H в два раза меньше предыдущего H. Это H-дерево порядка 1.
  3. Повторите шаг 2, чтобы создать фрактал H-Tree более высоких порядков, как показано на изображениях 3 и 4.

Ваше определение функции ДОЛЖНО иметь следующий формат: def h_tree (order, center, size): где: order - это порядок фрактала, как описано выше, center - это центральная точка H-Tree, в формате [x, y] размер - это длина каждой строки в H

Вот мой код:

import turtle

#reverse method
def reverse_string(string):
    if len(string) == 0:
        return string
    else:
        return reverse_string(string[1:]) + string[0]

#fractal method
def h_tree(order, center, size):
    if order == 0:
        draw_turtle([0,0], 300)
    else:
        get_endpoints(center, size)

        h_tree(order-1, ep1, size)
        h_tree(order-1, ep2, size)
        h_tree(order-1, ep3, size)
        h_tree(order-1, ep4, size)


def draw_turtle(center, size):
    turtle.showturtle()
    turtle.penup()
    turtle.goto(center)
    turtle.pendown()
    turtle.forward(size/2)
    turtle.left(90)
    turtle.forward(size/2)
    turtle.right(180)
    turtle.forward(size)
    turtle.penup()
    turtle.goto(center)
    turtle.right(90)
    turtle.pendown()
    turtle.forward(size/2)
    turtle.right(90)
    turtle.forward(size/2)
    turtle.right(180)
    turtle.forward(size)


    turtle.done()

def get_endpoints(center, size):
    ep1 = center[0] + size/2
    ep2 = center[1] + size/2
    ep3 = center[0] + size/2
    ep4 = center[1] + size/2
    return [ep1, ep2, ep3, ep4]


'''
The animate function needs to take in an x and y as arguments
because of how we are calling it from the main function.
Since it is being called when the mouse is clicked, it is
required to take the x,y location of the mouse at the time
of the click. You do not need to use the x,y for anything, so
just leave them there as parameters but you do not need to use 
them inside your function.
'''
'''
def animate(x, y):
    return
'''
def main():

    # Q1 - call the recursive reverse_string() function
    print(reverse_string("desserts"))
    print(reverse_string("flow"))
    print(reverse_string("abcdefg"))

    # Q2 - call the recursive H-Tree fractal function
    turtle.speed(0)
    turtle.hideturtle()
    h_tree(2, [0, 0], 300)

    turtle.done()
'''
    # Q3 - when the mouse is clicked in the turtle window,
    # call the animate() function to display a spinning star
    turtle.onscreenclick(animate)
'''    

main()

1 Ответ

0 голосов
/ 08 декабря 2018

У вас есть логика, которая в основном звучит, хотя и не так, как я бы это делал, но нуждается в некотором исправлении.Главным образом потому, что вы не выполняли свою собственную логику.Вы знаете, что h_tree() принимает позицию (пару чисел) в качестве второго аргумента, но вы передали только одно число (если даже это, как отмечает @SRTHellKitty, вы забыли сохранить результат get_endpoints()).Вы также забыли уменьшить size вдвое при рекурсивном вызове.Вы ошиблись в двух конечных точках.И вы не оставили черепаху в ее первоначальной ориентации в конце draw_turtle(), что привело бы к повороту половины фигуры H, если бы она заработала.

Ниже приведен исправленный код -Я вытащил ваш код для Q1, поскольку он не был связан с проблемами, о которых вы спрашиваете:

import turtle

def h_tree(order, center, size):
    draw_turtle(center, size)

    if order > 0:
        ep1, ep2, ep3, ep4 = get_endpoints(center, size)

        h_tree(order - 1, (ep1, ep2), size / 2)
        h_tree(order - 1, (ep1, ep4), size / 2)
        h_tree(order - 1, (ep3, ep2), size / 2)
        h_tree(order - 1, (ep3, ep4), size / 2)

def draw_turtle(center, size):
    turtle.penup()
    turtle.goto(center)
    turtle.pendown()

    turtle.forward(size / 2)  # right side of H
    turtle.left(90)
    turtle.forward(size / 2)
    turtle.right(180)
    turtle.forward(size)

    turtle.penup()
    turtle.goto(center)
    turtle.pendown()

    turtle.right(90)  # left side of H
    turtle.forward(size / 2)
    turtle.right(90)
    turtle.forward(size / 2)
    turtle.right(180)
    turtle.forward(size)

    turtle.right(90)  # return turtle to original orientation

def get_endpoints(center, size):
    ep1 = center[0] + size / 2
    ep2 = center[1] + size / 2
    ep3 = center[0] - size / 2
    ep4 = center[1] - size / 2

    return ep1, ep2, ep3, ep4

def main():

    turtle.speed('fastest')

    h_tree(2, (0, 0), 300)

    turtle.hideturtle()

    turtle.done()

main()

enter image description here

...