前言
立冬啦!正式步入冬天,不过长沙的天气在这两天时好时坏,但是在今天出太阳啦晒晒太阳,突然想到之前画了个樱花的视频,然后趁着心情好就把它解析出来,嘿嘿是真的还蛮好看的,而且一个代码可以随机画出多种样式的,一起来看看叭
完成目标
通过Python绘制樱花树
视频展现:
因为一种樱花树要画比较久,我也就稍微展示一下啦,当然还有很多种就没有一一录屏了,可以自行去研究哦,嘻嘻嘻
工具准备
开发工具: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,树枝可以设定成随机生长,通过随机数设定
# 画树枝部分def draw_tree(turtle_obj, branch, tree_color):# 设置一个最小分支长度min_branch = 4if 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),颜色:colorscreen_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)