前言
立冬啦!正式步入冬天,不過長沙的天氣在這兩天時好時壞,但是在今天出太陽啦曬曬太陽,突然想到之前畫了個櫻花的視訊,然後趁着心情好就把它解析出來,嘿嘿是真的還蠻好看的,而且一個代碼可以随機畫出多種樣式的,一起來看看叭
完成目标
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-yd3W5sfp-1665731480103)(//upload-images.jianshu.io/upload_images/26798310-b870f1df9d696ad7.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]
因為一種櫻花樹要畫比較久,我也就稍微展示一下啦,當然還有很多種就沒有一一錄屏了,可以自行去研究哦,嘻嘻嘻
工具準備
開發工具:pycharm
開發環境:python3.7, Windows11使用工具包:turtle
項目解析思路
項目思路分為3部分:
- 繪制櫻花的落葉花瓣,掉落的花瓣* 給櫻花樹添加樹枝* 給櫻花樹添加繪畫背景* 顔色的繪制選取各種樣式的顔色
繪制掉落花瓣功能
确定花瓣掉落的數量,掉落的花瓣數根據櫻花樹枝來判斷,和樹枝數乘15,樹畫的越大掉的就越多哈設定花瓣的坐标花瓣的大小設定為(10,10)控制畫筆移動到指定區域提筆,向前y,左轉90,走x,落筆,畫出花瓣形狀,繪畫完是以的花瓣數量就ok,在将畫的形狀指定顔色,在勾勒出圓形,回到起點提筆,後退x,右轉90,後退y,落筆
def draw_petal(turtle_obj, flower):
繪制掉落的花瓣
for i in range(int(flower)):
有正有負就可以讓畫筆往二個方向走
x = flower - 4 * flower * random()
花瓣整體寬度(-10, 10)
y = 10 - 20 * random()
提筆,向前y,左轉90,走x,落筆
turtle_obj.penup()
turtle_obj.forward(y)
turtle_obj.left(90)
turtle_obj.forward(x)
turtle_obj.pendown()
珊瑚色
turtle_obj.pencolor(“lightcoral”)
畫圓
turtle_obj.circle(1)
回到起點
提筆,後退x,右轉90,後退y,落筆
turtle_obj.penup()
turtle_obj.backward(x)
turtle_obj.right(90)
turtle_obj.backward(y)
turtle_obj.pendown()
畫樹枝部分
确定樹枝數量,顔色的色号選擇,先預設設定最小的樹枝分支長度個樹枝兩邊設定顔色能看起來更加的好看,左邊為白色,右邊為珊瑚色,分支的機率設定在0.5,樹枝可以設定成随機生長,通過随機數設定。對于新手小白想更輕松的學好Python基礎,Python爬蟲,web開發、大資料,資料分析,人工智能等技術,這裡給大家分享系統教學資源,聯系我魏X: 762459510 【教程/工具/方法/解疑】
# 畫樹枝部分def draw_tree(turtle_obj, branch, tree_color):
# 設定一個最小分支長度
min_branch = 4
if branch > min_branch:
if branch < 8:
# 以0.5的機率,向左、右分支
if randint(0, 1) == 0:
# 左為白色
turtle_obj.pencolor("snow")
else:
# 右為珊瑚色
turtle_obj.pencolor("lightcoral")
# 枝幹
turtle_obj.pensize(branch / 2)
elif 8 <= branch <= 16:
# 以0.33的機率,分為左、中、右分支
if randint(0, 2) == 0:
# 左為白色
turtle_obj.pencolor("snow")
else:
# 中、右為珊瑚色
turtle_obj.pencolor("lightcoral")
# 樹枝
turtle_obj.pensize(branch / 4)
else:
# 褐色
turtle_obj.pencolor(tree_color)
# 細枝
turtle_obj.pensize(branch / 10)
# 最開始的樹幹長度
turtle_obj.forward(branch)
# 随機度數因子
a = 1.5 * random()
# 順時針旋轉随機角度(0~30度)
turtle_obj.right(20 * a)
# 随機長度因子
b = 1.5 * random()
# 往右畫,直到畫不動為止
draw_tree(turtle_obj, branch - 10 * b, tree_color)
# 左轉随機角度
turtle_obj.left(40 * a)
# 往左畫,直到畫不動位置
draw_tree(turtle_obj, branch - 10 * b, tree_color)
# 右轉一定角度
turtle_obj.right(20 * a)
# 提筆
turtle_obj.penup()
# 遞歸結束回到起點
turtle_obj.backward(branch)
turtle_obj.pendown()
建立畫布,将資料顔色進行添加,設定好運作的加速倍數
def get_screen(width, height, color, speed):
# 建立畫幕
screen_obj = turtle.Screen()
# 畫布大小:(width, height),顔色:color
screen_obj.screensize(width, height, bg=color)
screen_obj.setup(1.0, 1.0)
# speed倍加速
screen_obj.tracer(speed)
return screen_obj
顔色畫布畫筆的選擇:
樹幹的顔色
畫筆的大小
前進的相素格
建立畫筆
畫筆的粗細調整
提筆落筆的選擇
畫筆的顔色配置
設定常量參數 枝幹的粗細 落花數 第幾顆數
def trees(tree_num):
# 顔色
color = ['brown', 'tan', 'black']
for j in range(tree_num):
# 樹幹顔色
tree_color = color[randint(0, len(color) - 1)]
# 畫筆大小
pensize = randint(2, 5)
# 前進像素
forward = ((-1) ** pensize) * pensize * randint(20, 50)
# 後退像素
if pensize <= 3:
backward = ((-1) ** pensize) * (5 - pensize) * randint(10, 15)
else:
backward = pensize * randint(45, 50)
# 建立畫筆
turtle_obj = turtle.Turtle()
# 畫筆粗細
turtle_obj.pensize(pensize)
# 提筆,向前forward,左轉90,backward,落筆
turtle_obj.penup()
turtle_obj.forward(forward)
turtle_obj.left(90)
turtle_obj.backward(backward)
turtle_obj.pendown()
# 畫筆顔色:褐色
turtle_obj.pencolor(tree_color)
# 枝幹粗細
branch = pensize * 15
# 落花數
flowers = branch
# 第j棵樹
draw_tree(turtle_obj, branch, tree_color)
# 花瓣
draw_petal(turtle_obj, flowers)
我是白又白i,一名喜歡講解知識的程式媛