簡單應用-櫻花樹
2024年10月22日大约 3 分鐘
學習內容:
- 理解 遞迴(recursion) 的概念。
- 使用 Python 的 Turtle 繪製圖形。
- 利用遞迴方式產生枝幹來繪製櫻花樹。
程式碼
import turtle as T
import random
import time
# 參數設定
花朵顏色1 = 'snow'
花朵顏色2 = '#ffaaaa'
花枝寬比1 = 3
花枝寬比2 = 2
枝幹顏色 = 'sienna'
落花顏色 = 'lightcoral'
落花半徑 = 1
開叉最大角 = 30
# 畫櫻花的樹幹
def Tree(branch, t):
time.sleep(0.0005) # 控制速度
if branch > 3:
if branch < 8:
t.color(random.choice([花朵顏色1, 花朵顏色2]))
t.pensize(branch / 花枝寬比2)
elif 8 <= branch <= 12:
t.color(random.choice([花朵顏色1, 花朵顏色2]))
t.pensize(branch / 花枝寬比1)
else:
t.color(枝幹顏色)
t.pensize(branch / 10)
t.forward(branch)
a = 1.5 * random.random()
t.right(開叉最大角 / 1.5 * a)
b = 1.5 * random.random()
Tree(branch - 10 * b, t)
t.left(開叉最大角 / 0.75 * a)
Tree(branch - 10 * b, t)
t.right(開叉最大角 / 1.5 * a)
t.up()
t.backward(branch)
t.down()
# 畫掉落的花瓣
def Petal(m, t):
for _ 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(落花顏色)
t.circle(落花半徑 * random.uniform(0.5, 1.5)) # 隨機大小
t.up()
t.backward(a)
t.right(90)
t.backward(b)
# 繪圖區域
t = T.Turtle()
w = T.Screen()
w.setup(width=800, height=600) # 畫布大小
w.screensize(bg='wheat')
t.hideturtle() # 隱藏畫筆
t.speed(0) # 最快速度
t.left(90) # 向上
t.up()
t.backward(150)
t.down()
t.color(枝幹顏色)
# 取消下行的註解,可加快繪圖速度
# t.getscreen().tracer(0, 0)
# 畫櫻花樹幹
Tree(60, t)
# 畫掉落的花瓣
Petal(200, t)
# 強制更新畫面
w.update()
# 點擊畫面退出
w.exitonclick()
程式碼說明
Tree()
函數 - 畫樹幹與花朵
Tree()
是一個遞迴函數,透過不斷減少樹枝長度,來模擬樹幹的分叉,直到達到設定的最小長度停止。
- 樹幹分叉角度:用
random
生成的隨機數,讓樹看起來更自然。 - 樹枝顏色與粗細:
- 粗樹枝(8 <= branch <= 12):隨機變化花朵顏色為白色或淡珊瑚色。
- 細樹枝(branch < 8):花朵變色機率更高,模擬不同大小的花瓣。
- 停止條件:當
branch <= 3
時不再分叉。
Petal()
函數 - 畫掉落的花瓣
Petal()
生成隨機的花瓣位置並畫圓形花瓣。
- 隨機座標:透過
random
生成落花的x
、y
位置。 - 花瓣形狀:使用
t.circle()
畫出指定半徑的小圓來代表花瓣。
調整繪圖速度
透過 tracer()
可以控制畫面更新頻率,加快繪圖速度:
t.getscreen().tracer(0, 0) # 完全禁止畫面更新
最後在程式的最後呼叫一次 update()
強制更新畫面:
w.update()
確保畫布大小適當
如果樹太大或花瓣看不到,可以增加畫布大小:
w.setup(width=800, height=600)
執行結果
- 樹幹隨機分叉,花瓣顏色和粗細變化自然。
- 花瓣掉落在畫布上的隨機位置,並且大小略有差異。
- 如果使用
tracer(0, 0)
,可省略繪製過程,讓畫面更快呈現出來。
練習
- 試著調整畫布大小、控制更新頻率,以及隨機變化花瓣大小,觀察畫出來的不同效果。
- 有興趣的同學可試著增加更多自然效果,例如:
- 調整花瓣大小:
落花半徑
設為隨機數。 - 增加風的效果:讓花瓣隨機旋轉角度。
- 調整花瓣大小: