程序員就只能簡簡單單的用手裏的代碼來實現自己最直接的想法。-------------魯迅表示這句話他沒說過—————————————————————————————————————————————
在家上網課賊無聊,於是複習以前的知識點,瞥到之前用遞歸實現的科赫曲線,突然來了一點頭緒,上博客轉轉,卻看到一堆大佬畫的櫻花樹,實屬牛逼,就是感覺教學不是很詳細,於是我研究了一下,寫下我所理解的關於樹的畫法,下面有些思想還是借鑑大佬們的。
————————————————————————————————————————————–
在這裏我們是要用到turtle函數庫,用法可以參考我關注的博主教程:turtle庫的使用
這裏如果有不懂遞歸的朋友也可以參考這位博主的解析:遞歸思路
效果圖:
一種顏色的花朵的樹:
這是很多大佬的原思想圖,我做了一點改進。
畫這棵樹分爲二部分,畫整體和畫落下的花瓣:
畫落下的花瓣:
這裏用到了隨機函數庫random,確保每次畫葉子的位置不同,形成那種真實感:
import turtle as t
for i in range(150): # 循環150次 繪製 掉落的花瓣
a = 250 - 500 * random.random() # 花瓣整體長度,有正有負就可以讓海龜往二個方向走
b = 10 - 20 * random.random() # 花瓣整體寬度,正負道理一致,數值可以根據實際輸入
t.penup() # 擡筆向前隨機走b個寬度,左轉90,隨機走a個長度,落筆,跟我畫一個小圈圈
t.fd(b)
t.left(90)
t.fd(a)
t.pendown()
t.pencolor("lightcoral") # 珊瑚色
t.circle(1)
t.penup() # 跟我左邊擡個筆,後退個a的長度,右邊轉個90,後退個b的寬度,這樣可以
t.backward(a) # 讓海龜回到和剛出發位置差不多的水平線上,所以上面的b設置最好小一點
t.right(90)
t.backward(b)
畫樹枝部分:
這裏用到了二叉樹的遞歸思想:
我就小小的畫了一個很正的二叉樹給你們看看效果就行
這樣的樹就是很端正,但是實話就是不好看,我們給出代碼:
import turtle as t
brance = 60 # 枝條 總度
def draw_tree1(brance):
if brance > 10: # 條件滿足先畫右邊
t.fd(brance) # 繪製最開始的樹幹
t.right(30) # 然後右轉30,第一個右分支
draw_tree1(brance / 1.5) # 繼續畫右邊的 走不動了往左邊轉60 和下面一樣用到了遞歸
t.left(60) # 然後左轉60 進入向左繪製
draw_tree1(brance / 1.5) # 繼續畫左邊的,走不動了右轉30回到最後一步的之前那個節點
t.right(30)
# 給最後二個樹枝畫上雪白的葉子
if brance / 1.5 <= 10: # 這個條件可以根據實際設置
t.pencolor("snow")
else:
t.pencolor("Tan") # 褐色
t.backward(brance) # 當遞歸條件不滿足的時候,後退一個節點
思考什麼因素讓這棵樹如此端正,因爲每次向左向右的角度固定,向前衍生的枝條長度也是固定
那我們可以想到用隨機函數庫random來實現每次的操作不一致,就能產生不一樣的效果
畫一種顏色的樹:
代碼:
import turtle as t
brance = 70
def draw_tree(brance): # 畫樹枝部分 分支量
if brance > 4: # 設置一個最小分支量 可以自己改
if 8 <= brance <= 16: # 分支量在這個範圍內,畫筆大小縮小四倍,畫中等細小的樹枝
t.pencolor("lightcoral") # 珊瑚色
t.pensize(brance / 4)
elif brance < 8: # 分支量在這個範圍內,畫筆大小縮小二倍 , 畫細小的樹枝
t.pencolor("lightcoral") # 珊瑚色
t.pensize(brance / 2)
else: # 其他範圍內,我們讓程序畫樹幹部分
t.pencolor("Tan") # 褐色
t.pensize(brance / 10) # 縮小支柱
t.fd(brance) # 最開始的樹幹部分
a = 1.5 * random.random() # 隨機度數因子
t.right(20 * a) #右轉隨機角度
b = 1.5 * random.random() # 隨機長度因子
draw_tree(brance - 10 * b) # 往右畫,直到畫不動爲止,然後左轉隨機度數
t.left(40 * a) # 左轉隨機角度
draw_tree(brance - 10 * b) # 往左畫,直到畫不動位置,然後右轉隨機度數
t.right(20 * a) # 右轉一定角度
t.penup()
t.backward(brance) # 遞歸結束回到上一個節點
t.pendown()
這樣我們就實現了一棵只有一種顏色花朵的樹
畫二種顏色的樹:
如何繪製二種顏色的樹呢?我們只需要在每一個分支範圍內進行一次判斷,如果條件爲真,那我們改顏色,反之,我們不改顏色:
代碼如下:
if 8 <= brance <= 16:
if random.randint(0, 2) == 0: #這裏隨機三個數 三分之一概論 改顏色
t.pencolor("snow") # 因爲這個範圍還是畫中等細小樹枝
else:
t.pencolor("lightcoral") # 珊瑚色
t.pensize(brance / 4)
elif brance < 8:
if random.randint(0, 1) == 0: # 這裏隨機兩二個樹,二分之一
t.pencolor("snow") # 因爲這裏畫很細小的樹枝 概論小點
else:
t.pencolor("lightcoral") # 珊瑚色
t.pensize(brance / 2)
else:
t.pencolor("Tan") # 褐色
t.pensize(brance / 10) # 縮小分支量
大致代碼基本都給出了,這裏說明一下,如果想繪製二棵以上,只要在主程序下面先運行一棵,然後修改一下起點位置,重新調用一下二個函數就行,裏面的值最好設置小一點,可以有個層次感。
主程序:
import turtle as T
import random
t = T.Turtle()
w = T.Screen()
w.screensize(bg='wheat') # 畫布顏色小麥色 個人覺得還是這個最搭配
t.getscreen().tracer(5, 0) # 返回正在繪製的對象 並且加速5倍
t.pensize(5)
t.left(90)
t.penup()
t.backward(250)
t.pendown()
t.pencolor("Tan") # 褐色
draw_tree(70) # 第一顆桃花,支柱設置70
petel(250) # 花瓣250
w.exitonclick() # 點擊關閉畫布