三月桃花开,用python给你带来你的桃花运,详细解析画一棵表白树!
程序员就只能简简单单的用手里的代码来实现自己最直接的想法。-------------鲁迅表示这句话他没说过—————————————————————————————————————————————
在家上网课贼无聊,于是复习以前的知识点,瞥到之前用递归实现的科赫曲线,突然来了一点头绪,上博客转转,却看到一堆大佬画的樱花树,实属牛逼,就是感觉教学不是很详细,于是我研究了一下,写下我所理解的关于树的画法,下面有些思想还是借鉴大佬们的。
————————————————————————————————————————————–
在这里我们是要用到turtle函数库,用法可以参考我关注的博主教程:turtle库的使用
这里如果有不懂递归的朋友也可以参考这位博主的解析:递归思路
效果图:
一种颜色的花朵的树:
这是很多大佬的原思想图,我做了一点改进。
画这棵树分为二部分,画整体和画落下的花瓣:
画落下的花瓣:
这里用到了随机函数库random,确保每次画叶子的位置不同,形成那种真实感:
import turtle as tfor 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 tbrance = 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() # 点击关闭画布
三月桃花开,用python给你带来你的桃花运,详细解析画一棵表白树!相关推荐
- (python实现表白树)四月桃花开,用python给你带来你的桃花运,详细解析画一棵表白树!
python实现表白树,50行代码实现! 效果图: 画这棵树分为二部分,画整体和画落下的花瓣: 画落下的花瓣: 画树枝部分: 画一种颜色的树: 画二种颜色的树: 主程序: 我们不做代码的搬运工,要做有 ...
- 用python给你带来你的桃花运,详细解析画一棵表白树!
程序员就只能简简单单的用手里的代码来实现自己最直接的想法.-------------鲁迅表示这句话他没说过--------------------------------------------- 在 ...
- python椭圆花瓣_用Python给你带来你的桃花运,详细解析画一棵表白树
程序员就只能简简单单的用手里的代码来实现自己最直接的想法.-------------鲁迅表示这句话他没说过 在家上网课贼无聊,于是复习以前的知识点,瞥到之前用递归实现的科赫曲线,突然来了一点头绪,上博 ...
- Python Exceptions 异常处理全过程以及异常模块详细解析
1.异常的定义 程序运行时检测到错误而导致解释器无法继续执行,反而出现一些错误的提示 2.捕捉异常全过程(重点) try:print("可能产生异常的代码")except Exce ...
- 用Python画一棵分形树
文章目录 画一棵分形树 加入随机量的分形树 加入点缀的圣诞树 画一棵分形树 分形树,就是用分形的逻辑去画一棵树,所谓分形,若从编程的角度去理解,其实就是简单规则的反复迭代. 例如,现在有一条线段,长为 ...
- 用Python实现快速排序和冒泡排序,代码+详细解析
1.冒泡排序 冒泡排序:每一次相邻的两个数做比较,大的往后移动一位,每次循环都会把最大的值(升序)或最小的值(降序)放在末端 . # a = [7, 8, 5, 45, 91, 1, -10, 0] ...
- Python画一棵茂盛的分形树
文章目录 前情回顾 添加分岔 茂盛的分形树 前情回顾 上次画了一棵分形树:用Python画一棵分形树,得到的图如下 发现看的人还是挺多的,但没什么人点赞,这说明我能给大家画分形树,大家很高兴,但这棵树 ...
- python嵌套html开发gui_python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例...
PyQt5布局控件QFormLayout简介 QFormLayout是label-field式的表单布局,顾明思议,就是实现表单方式的布局,表单是提示用户进行交互的一种模式,主要有两列组成,第一列用于 ...
- 电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分
电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分,是电影天堂APP项目开发课程的第一篇章,讲解使用requests和bs4库,爬取和解析电影天堂网站数据,并讲数据保存到SQLite数 ...
最新文章
- 液晶显示原理与ILI9341的使用
- python 求list最小值的索引_【挑战自学Python编程】第六天:前五天都学了啥?
- 文件包含漏洞——DVWA练习
- NYOJ-522 Interval
- 面试pythone_python面试常见问题有哪些
- linux下安装配置apache+php,linux下安装apache与php;Apache+PHP+MySQL配置攻略
- 6个很棒的PostCSS插件,让您成为一个CSS向导
- 执行shell脚本报/bin/bash^M: bad interpreter
- C#关键字扫盲——Tuple(元组类) 、ValueTuple(值元组)
- 先验概率与后验概率的区别
- 配置 LDAP 服务器
- POJ 1442 Black Box 优先队列
- MATLAB常用画图命令汇总【已坑】
- 地图服务 纬度、经度对应坐标轴x,y
- 包装印前软件“方正锐利”升级到11.5版本,新增可变数据印刷功能
- Talk with GoF
- 即将发布的 Apache Spark 3.2 将内置 Pandas API
- 投资中最简单的事--阅读笔记
- wwwxxx域名选择(www.xxx.com或者.cn)
- 前端基础之CSS盒子模型