【问题标题】:Drawing a fractal tree in Python, not sure how to proceed在 Python 中绘制分形树,不知道如何进行
【发布时间】:2017-02-12 15:52:13
【问题描述】:

到目前为止,我在 python 中有这个

import turtle
import math
t = turtle.Turtle()
t.shape("turtle")
t.lt(90)

lv = 11
l  = 100
s  = 17

t.penup()
t.bk(l)
t.pendown()
t.fd(l)

def draw_tree(l, level):
    l = 3.0/4.0*l
    t.lt(s)
    t.fd(l)
    level +=1
    if level<lv:
        draw_tree(l, level)

    t.bk(l)
    t.rt(2*s)
    t.fd(l)
    if level<=lv:
        draw_tree(l, level)
    t.bk(l)
    t.lt(s)
    level -=1

t.speed(100)        
draw_tree(l, 2)

但我有点纠结于如何前进,因为我需要伸手去建造这棵树。这就是我想要制作的:

谁能告诉我我做错了什么?

【问题讨论】:

  • 不知道为什么它把字母 l 改成了 1,但应该是 l 而不是 1
  • 它目前画的是什么?你至少能得到树的“树干”吗?一个分支?

标签: python turtle-graphics fractals


【解决方案1】:

我真的很喜欢@cdlane 的答案,所以我玩了一段时间的代码。树现在看起来好多了,代码可读性也好多了,所以我认为值得分享。

代码:

import turtle

WIDTH = 15
BRANCH_LENGTH = 120
ROTATION_LENGTH = 27


class Tree_Fractal(turtle.Turtle):
    def __init__(self, level):
        super(Tree_Fractal, self).__init__()
        self.level = level
        self.hideturtle()
        self.speed('fastest')
        self.left(90)
        self.width(WIDTH)
        self.penup()
        self.back(BRANCH_LENGTH * 1.5)
        self.pendown()
        self.forward(BRANCH_LENGTH)
        self.draw_tree(BRANCH_LENGTH, level)

    def draw_tree(self, branch_length, level):
        width = self.width()
        self.width(width * 3. / 4.)
        branch_length *= 3. / 4.
        self.left(ROTATION_LENGTH)
        self.forward(branch_length)

        if level > 0:
            self.draw_tree(branch_length, level - 1)
        self.back(branch_length)
        self.right(2 * ROTATION_LENGTH)
        self.forward(branch_length)

        if level > 0:
            self.draw_tree(branch_length, level - 1)
        self.back(branch_length)
        self.left(ROTATION_LENGTH)

        self.width(width)


if __name__ == '__main__':
    tree_level = 11  # choose
    tree = Tree_Fractal(tree_level)
    turtle.done()

【讨论】:

    【解决方案2】:

    你的代码基本上是正确的,你主要需要调整你的参数。您尝试匹配的示例树大于您正在绘制的树(可能在该图像中缩小),因此增加您的 l 参数。示例树的递归级别比您的多,因此请增加您的 lv 参数。

    最后,您需要根据递归级别重置画笔宽度(并在退出时取消设置。)您的代码的以下返工可以做到这一点,但需要进一步微调:

    import turtle
    
    t = turtle.Turtle(shape="turtle")
    
    t.lt(90)
    
    lv = 13
    l = 120
    s = 17
    
    t.width(lv)
    
    t.penup()
    t.bk(l)
    t.pendown()
    t.fd(l)
    
    def draw_tree(l, level):
        width = t.width()  # save the current pen width
    
        t.width(width * 3.0 / 4.0)  # narrow the pen width
    
        l = 3.0 / 4.0 * l
    
        t.lt(s)
        t.fd(l)
    
        if level < lv:
            draw_tree(l, level + 1)
        t.bk(l)
        t.rt(2 * s)
        t.fd(l)
    
        if level < lv:
            draw_tree(l, level + 1)
        t.bk(l)
        t.lt(s)
    
        t.width(width)  # restore the previous pen width
    
    t.speed("fastest")
    
    draw_tree(l, 2)
    
    turtle.done()
    

    【讨论】:

      【解决方案3】:

      这里是如何用 17 行编写它(没有函数):

      import turtle
      for i in range(2048): #how many branches(2 ** depth)
      turtle.goto(0,0) #beginning of tree
      turtle.setheading(90) #direction(try 270 for root effect)
      turtle.hideturtle() #MUCH faster drawing and better view
      a = str(bin(i)).replace('0b','') #binary is for two branches('0b' ignored)
      a = list(str('0' * (11 - len(list(a)))) + a) #cake filling
      turtle.speed(0) #no animation
      turtle.pendown() #you probably wanna draw it
      for f in range(len(a)): #depth
          b = 200 #primary branch length
          for l in range(f + 1): #more depth less length
              b /= 1.5 #the difference of branch length(b = b / float)
          turtle.width(b / 10) #branch width(for better effect)
          turtle.forward(b) #drawing a branch
          turtle.right((int(a[f]) - 0.5) * 60) #change 60 to any angle
      turtle.penup() #also try without this line
      

      【讨论】:

        猜你喜欢
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 2019-01-09
        • 1970-01-01
        • 2019-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多