技術圖文:如何利用 Turtle 繪製一棵漂亮的櫻花樹

背景

最近看到很多機構在推動“青少年編程能力等級標準”的制定以及相關考試的測評,看樣子今年年底這個事情就能夠確定,明天上半年在一些大中城市就會全面鋪開。

我最近了解了一些關於“編程貓”和“學而思”在制定標準上的思路,其主要使用的語言爲 Scratch 和 Python。自己在培訓小孩子編程方面也有一些經驗,由於小孩子專注的時間有限,所以需要用直觀形象的方式引導他們理解編程思維。

Scratch 主要針對的是幼稚園大班以及一二年級的孩子,三年級以上就可以學習Python了,利用 Python 讓小孩子掌握編程思維最好圍繞 Turtle 庫來展開。

Turtle 最早來自於 LOGO 語言,是專門用於小孩子學習編程的,通過編程模擬一隻 turtle(海龜)在畫板上爬行繪製圖案,後來很多高級語言都移植了海龜繪圖,python 從2.6之後也將 turtle 庫加入了其內部庫中。


技術分析

利用 turtle 庫,即可以繪製簡單的圖形,也可以通過 分形幾何 的方式繪製非常複雜的圖案。我在網上找了幾段繪製櫻花樹的代碼,大家感覺一下。有基礎的家長可以在空閒的時候,學習一下來慢慢培養小孩子的編程思維。

動態生成櫻花

01

飄落效果

02

暗色效果

03


代碼實現

動態生成櫻花代碼

import turtle as T
import random
import time


# 畫櫻花的軀幹(60,t)
def Tree(branch, t):
    time.sleep(0.0005)
    if branch > 3:
        if 8 <= branch <= 12:
            if random.randint(0, 2) == 0:
                t.color('snow')  # 白
            else:
                t.color('lightcoral')  # 淡珊瑚色
            t.pensize(branch / 3)
        elif branch < 8:
            if random.randint(0, 1) == 0:
                t.color('snow')
            else:
                t.color('lightcoral')  # 淡珊瑚色
            t.pensize(branch / 2)
        else:
            t.color('sienna')  # 赭(zhě)色
            t.pensize(branch / 10)  # 6
        t.forward(branch)
        a = 1.5 * random.random()
        t.right(20 * a)
        b = 1.5 * random.random()
        Tree(branch - 10 * b, t)
        t.left(40 * a)
        Tree(branch - 10 * b, t)
        t.right(20 * a)
        t.up()
        t.backward(branch)
        t.down()


# 掉落的花瓣
def Petal(m, t):
    for i in range(m):
        a = 200 - 400 * random.random()
        b = 10 - 20 * random.random()
        t.up()
        t.forward(b)
        t.left(90)
        t.forward(a)
        t.down()
        t.color('lightcoral')  # 淡珊瑚色
        t.circle(1)
        t.up()
        t.backward(a)
        t.right(90)
        t.backward(b)


# 繪圖區域
t = T.Turtle()
# 畫布大小
w = T.Screen()
t.hideturtle()  # 隱藏畫筆
t.getscreen().tracer(5, 0)
w.screensize(bg='wheat')  # wheat小麥
t.left(90)
t.up()
t.backward(150)
t.down()
t.color('sienna')

# 畫櫻花的軀幹
Tree(60, t)
# 掉落的花瓣
Petal(200, t)
w.exitonclick()

飄落效果代碼

from turtle import *
from random import *
from math import *


def tree(n, l):
    pd()  # 下筆
    # 陰影效果
    t = cos(radians(heading() + 45)) / 8 + 0.25
    pencolor(t, t, t)
    pensize(n / 3)
    forward(l)  # 畫樹枝

    if n > 0:
        b = random() * 15 + 10  # 右分支偏轉角度
        c = random() * 15 + 10  # 左分支偏轉角度
        d = l * (random() * 0.25 + 0.7)  # 下一個分支的長度
        # 右轉一定角度,畫右分支
        right(b)
        tree(n - 1, d)
        # 左轉一定角度,畫左分支
        left(b + c)
        tree(n - 1, d)
        # 轉回來
        right(c)
    else:
        # 畫葉子
        right(90)
        n = cos(radians(heading() - 45)) / 4 + 0.5
        pencolor(n, n * 0.8, n * 0.8)
        circle(3)
        left(90)
        # 添加0.3倍的飄落葉子
        if (random() > 0.7):
            pu()
            # 飄落
            t = heading()
            an = -40 + random() * 40
            setheading(an)
            dis = int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2)
            forward(dis)
            setheading(t)
            # 畫葉子
            pd()
            right(90)
            n = cos(radians(heading() - 45)) / 4 + 0.5
            pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)
            circle(2)
            left(90)
            pu()
            # 返回
            t = heading()
            setheading(an)
            backward(dis)
            setheading(t)
    pu()
    backward(l)  # 退回


bgcolor(0.5, 0.5, 0.5)  # 背景色
ht()  # 隱藏turtle
speed(0)  # 速度 1-10漸進,0 最快
tracer(0, 0)
pu()  # 擡筆
backward(100)
left(90)  # 左轉90度
pu()  # 擡筆
backward(300)  # 後退300
tree(12, 100)  # 遞歸7層
done()

暗色效果代碼

from turtle import *
from random import *
from math import *


def tree(n, l):
    pd()
    t = cos(radians(heading() + 45)) / 8 + 0.25
    pencolor(t, t, t)
    pensize(n / 4)
    forward(l)
    if n > 0:
        b = random() * 15 + 10
        c = random() * 15 + 10
        d = l * (random() * 0.35 + 0.6)
        right(b)
        tree(n - 1, d)
        left(b + c)
        tree(n - 1, d)
        right(c)
    else:
        right(90)
        n = cos(radians(heading() - 45)) / 4 + 0.5
        pencolor(n, n, n)
        circle(2)
        left(90)
    pu()
    backward(l)


bgcolor(0.5, 0.5, 0.5)
ht()
speed(0)
tracer(0, 0)
left(90)
pu()
backward(300)
tree(13, 100)
done()


總結

是不是很有意思,簡單的代碼就可以繪製出很絢爛的圖形,讓小孩子感受到寫代碼的樂趣,家長們通過設計一道道進階的關卡,類似於我們玩遊戲過關的方式,讓小孩子們產生心流體驗。慢慢就會愛上編程。今天就到這裏吧!See You!


參考文獻

  • https://blog.csdn.net/weixin_44078196/article/details/100656515
  • https://blog.csdn.net/weixin_43943977/article/details/102691392

相關圖文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章