三月桃花開,用python給你帶來你的桃花運,詳細解析畫一棵表白樹!

程序員就只能簡簡單單的用手裏的代碼來實現自己最直接的想法。-------------魯迅表示這句話他沒說過—————————————————————————————————————————————
在家上網課賊無聊,於是複習以前的知識點,瞥到之前用遞歸實現的科赫曲線,突然來了一點頭緒,上博客轉轉,卻看到一堆大佬畫的櫻花樹,實屬牛逼,就是感覺教學不是很詳細,於是我研究了一下,寫下我所理解的關於樹的畫法,下面有些思想還是借鑑大佬們的。

————————————————————————————————————————————–
在這裏我們是要用到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()  # 點擊關閉畫布


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