2016-10-04 82 views
1

我有这个迄今为止在蟒蛇绘制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) 

但我有点卡住关于如何proges,因为我需要达到建立这种树。这就是我想要产生:

Fractal tree

任何一个可以告诉我什么,我做错了什么?

+0

不知道为什么它改变了字母l 1,但应该是升而不是1 – Sebastian

+1

这是什么目前画画吗?你能够获得至少树的“树干”吗?一个分支? –

回答

3

您的代码基本上是正确的,你主要是需要调整的参数。你想匹配的例子树比你画什么(即图像中有可能减少),因此增加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() 
+0

非常感谢!我现在设法做到了 – Sebastian

0

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

enter image description here

代码:

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() 
相关问题