使用递归python的H树

时间:2018-12-08 00:26:24

标签: python recursion turtle-graphics fractals

我一直在尝试对此进行编码,但是它不起作用,我感到困惑。

使用递归绘制“ H树”分形。

H-Tree分形定义如下:

  1. 以字母H开头。H的三行长度相同,如第一幅图像所示。这是0阶的H树。
  2. 字母H有四个端点。绘制一个以四个端点中的每个端点为中心的H,如第二个图像所示。这些H的大小是前一个H的一半。 1阶H树
  3. 重复步骤2以创建更高阶的H-Tree分形,如图3和图4所示。

您的函数定义必须具有以下格式:     def h_tree(顺序,中心,大小):     哪里: 如上所述,阶次是分形的阶次 center是H树的中心点,格式为[x,y] size是H中每行的长度

这是我的代码:

PUSHER_CLUSTER

1 个答案:

答案 0 :(得分:0)

您有一个基本合理的逻辑,虽然这不是我会做的方式,但需要进行一些修补。主要是因为您没有遵循自己的逻辑。您知道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