1. 程式人生 > >turtle畫分形樹

turtle畫分形樹

今天用了python內建的turtle繪相簿,感覺很有意思。然後嘗試用turtle+遞迴畫了一個分型樹。程式碼如下,

import turtle

toplevel = 6    #一共遞迴6層
angle = 30
rangle = 15
def drawTree(length, level):
    turtle.left(angle)      #繪製左枝
    turtle.forward(length)

    if level == toplevel:   #葉子
        turtle.circle(2,360)

    if level < toplevel:            #在左枝退回去之前遞迴
        drawTree(length-10, level+1)
    turtle.back(length)

    turtle.right(angle+rangle)   #繪製右枝
    turtle.forward(length)

    if level == toplevel:   #葉子
        turtle.circle(2,360)

    if level < toplevel:            #在右枝退回去之前遞迴
        drawTree(length-10, level+1)
    turtle.back(length)
    turtle.left(rangle)

turtle.left(90)
turtle.penup()
turtle.back(300)
turtle.pendown()
turtle.forward(100)
turtle.speed('fastest')
drawTree(80,1)

turtle.done()

圖形是這樣,

這個稍微美化了一些,來看個最原始的版本:

import turtle

toplevel = 6    #一共遞迴6層
angle = 30
def drawTree(length, level):
    turtle.left(angle)      #繪製左枝
    turtle.forward(length)

    if level < toplevel:            #在左枝退回去之前遞迴
        drawTree(length-10, level+1)
    turtle.back(length)

    turtle.right(angle*2)   #繪製右枝
    turtle.forward(length)

    if level < toplevel:            #在右枝退回去之前遞迴
        drawTree(length-10, level+1)
    turtle.back(length)
    turtle.left(angle)

turtle.tracer(0) #不重新整理
turtle.left(90)
drawTree(80,1)
turtle.update()  #重新整理,和上面的tracer(0)配合,直接出圖形,忽略過程

turtle.done()

其中,這裡去掉了樹幹,去掉了樹葉,去掉了讓樹向左歪。圖形如下

最後,我們可以繼續美化這顆分型樹,下面說幾點想到的:

  • 樹幹的粗細可以不同,最好從下往上依次變細。
  • 樹葉可以畫的漂亮些,不僅僅是個圓。
  • 背景顏色可以改變。
  • 樹幹,樹葉顏色可以改變。
  • 可以加入一些隨機的樹葉。
  • 可以給左右角度一個合理的隨機範圍,這樣就不止可以讓樹歪,而是變得有層次感。

暫時想到這麼多,挺晚了,該睡了,下次有機會再實現。