python 使用turtule繪制遞歸圖形(螺旋、二叉樹、謝爾賓斯基三角形)


插圖工具使用Python內置的turtle模塊,為什么叫這個turtle烏龜這個名字呢,可以這樣理解,創建一個烏龜,烏龜能前進、后退、左轉、右轉,烏龜的尾巴朝下,它移動時就會畫一條線。並且為了增加烏龜畫圖的藝術價值,可以改變尾巴寬度和尾巴浸入墨水的顏色。

1.遞歸繪制螺旋

我們讓烏龜以line_len長度前進,然后向右旋轉90°,然后縮短line_len長度遞歸調用draw_spiral函數

import turtle

my_turtle = turtle.Turtle()
my_win = turtle.Screen()


def draw_spiral(tur, line_len):
    if line_len > 0:
        my_turtle.forward(line_len)
        my_turtle.right(90)
        draw_spiral(tur, line_len - 1)


draw_spiral(my_turtle, 100)
my_win.exitonclick() 

2.遞歸繪制二叉樹

首先繪制branch_length長度的主干枝條,然后向右旋轉20°,遞歸調用draw_tree繪制主干枝條上的右分支,之后再向左旋轉40°(因為需要抵消右旋轉的20°),遞歸調用draw_tree繪制主干枝條的左分支,然后再向右旋轉20°,原路返回。

import turtle

my_tree = turtle.Turtle()
my_win = turtle.Screen()


def draw_tree(branch_length, t):
    if branch_length > 5:
        t.forward(branch_length)
        t.right(20)
        draw_tree(branch_length-20, t)
        t.left(40)
        draw_tree(branch_length-20, t)
        t.right(20)
        t.backward(branch_length)


my_tree.left(90)
my_tree.up()  # 抬起尾巴
my_tree.backward(200)
my_tree.down()  # 放下尾巴
my_tree.color('green')
draw_tree(100, my_tree)
my_win.exitonclick()

3.繪制謝爾賓斯基三角形

謝爾賓斯基三角形使用了三路遞歸算法,從一個大三角形開始,通過連接每一個邊的中點,將大三角型分為四個三角形,然后忽略中間的三角形,依次對其余三個三角形執行上述操作。

import turtle


def draw_triangle(points, color, my_angle):
    my_angle.fillcolor(color)
    my_angle.up()
    my_angle.goto(points[0][0], points[0][1])
    my_angle.down()
    my_angle.begin_fill()
    my_angle.goto(points[1][0], points[1][1])
    my_angle.goto(points[2][0], points[2][1])
    my_angle.goto(points[0][0], points[0][1])
    my_angle.end_fill()


def get_mid(p1, p2):
    return ((p1[0]+p2[0])/2, (p1[1]+p2[1])/2)


def sierpinski(points, degree, my_angle):
    colormap = ['blue', 'red', 'green', 'yellow',
                'violet', 'orange', 'white']
    draw_triangle(points, colormap[degree], my_angle)
    if degree > 0:
        sierpinski([points[0],
                    get_mid(points[0], points[1]),
                    get_mid(points[0], points[2])],
                   degree - 1, my_angle)
        sierpinski([points[1],
                    get_mid(points[0], points[1]),
                    get_mid(points[1], points[2])],
                   degree - 1, my_angle)
        sierpinski([points[2],
                    get_mid(points[2], points[1]),
                    get_mid(points[0], points[2])],
                   degree - 1, my_angle)


my_turtle = turtle.Turtle()
my_win = turtle.Screen()
my_points = [[-100, -50], [0, 100], [100, -50]]
sierpinski(my_points, 3, my_turtle)
my_win.exitonclick()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM