【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)
Python 利用 绘制 16 Tree 4.0 递归函数
2023-09-14 09:00:04 时间
1.案例描述
树干为80,分叉角度为20,树枝长度小于5则停止。树枝长小于30,可以当作树叶了,树叶部分为绿色,其余为树干部分设为棕色。
2.案例分析
由于分形树具有对称性,自相似性,所以我们可以用递归来完成绘制。只要确定开始树枝长、每层树枝的减短长度和树枝分叉的角度,我们就可以把分形树画出来啦!!
递归基本逻辑(原路返回):右侧树枝绘制递出处理+左侧树枝绘制递出处理+归来时处理(递出和归来两个模型结合)。最大优点是逻辑容易理解,最大缺点是重复操作较多易有性能问题。
3.分形几何学
客观事物具有自相似的层次结构,局部与整体在形态、功能、信息、时间、空间等方面具有统计意义上的相似性,称为自相似性。自相似性是指局部是整体成比例缩小的性质。
4.上机实验一(普通分形树)
""" 作者:梁斌 功能:利用递归函数绘制分形树 版本:1.0 日期:03/08/2017 """ import turtle def draw_branch(branch_length): """ 绘制分形树 """ if branch_length > 5: # 绘制右侧树枝 turtle.forward(branch_length) print('向前 ', branch_length) turtle.right(20) print('右转 20') draw_branch(branch_length - 15) # 绘制左侧树枝 turtle.left(40) print('左转 40') draw_branch(branch_length - 15) # 返回之前的树枝 turtle.right(20) print('右转 20') turtle.backward(branch_length) print('向后 ', branch_length) def main(): """ 主函数 """ turtle.left(90) turtle.penup() turtle.backward(150) turtle.pendown() turtle.color('brown') draw_branch(80) turtle.exitonclick() if __name__ == '__main__': main()
5.上机实验二(树枝带颜色分形树)
# -*- coding: utf-8 -*- ''' 绘制分形树 ''' import turtle as tl def draw_smalltree(tree_length,tree_angle,tree_wide): ''' 绘制分形树函数 ''' if tree_length >= 5: tl.pensize(tree_wide) tl.forward(tree_length) #往前画 tl.right(tree_angle) #往右转 draw_smalltree(tree_length - 10,tree_angle,tree_wide*2/3)#画下一枝,直到画到树枝长小于3 tl.left(2 * tree_angle) #转向画左 draw_smalltree(tree_length -10,tree_angle,tree_wide*2/3) #直到画到树枝长小于3 tl.rt(tree_angle) #转到正向上的方向,然后回溯到上一层 if tree_length <= 30: #树枝长小于30,可以当作树叶了,树叶部分为绿色 tl.pencolor('green') if tree_length > 30: tl.pencolor('brown') #树干部分为棕色 tl.pensize(tree_wide) tl.backward(tree_length) #往回画,回溯到上一层 def main(): tl.screensize(100, 100, "black") #画布大小 tl.penup() tl.left(90) #因为树是往上的,所以先把方向转左 tl.backward(250) #把起点放到底部 tl.pendown() tl.pencolor('brown') tl.speed(10) tree_length = 80 #我设置的最长树干为80 tree_angle = 20 #树枝分叉角度,我设为20 tree_wide = 5 #树枝粗度 draw_smalltree(tree_length,tree_angle,tree_wide) tl.exitonclick() #点击才关闭画画窗口 if __name__ == '__main__': main()
参考文档:
相关文章
- Python - 利用pip管理包
- 【python基础】Linux环境下非root用户安装Python和第三方包
- Python 字符串_python 字符串截取_python 字符串替换_python 字符串连接
- python: easyocr的安装和使用(easyocr 1.6.2 / Python 3.7.15 )
- Python:利用python语言实现18位身份证号码和15位身份证号码相互转换
- Python语言学习:利用pandas对两列字段元素求差集(对比两列字段所有元素的异同)
- Python绘图之matplotlib基础教程:利用matplotlib绘制热图并对横坐标重新设置,并按照指定显示的字符串可视化(比如将012改为ABC)
- Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件
- Python编程:利用python编程实现对基于时间序列的数据(dataframe格式)按照指定时间范围进行单方向关联,不存在的日期补充为默认的NaN
- Python:利用python语言实现18位身份证号码和15位身份证号码相互转换
- Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件
- Python:pmml格式文件的简介、安装、使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略
- Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略
- Python:利用pip/conda命令导出/安装当前环境所有的依赖包及其对应的版本号、在新的环境中安装导出的包之详细攻略
- Python:利用python代码编程实现将视频的avi格式转换为MP4格式
- 已解决2. Set PROTOCOL_BUPFERS_PYTHON_iMPLEMENTATION=python (but this will use pure-Python parsing and w
- 【python代码】:能在手机上敲 Python 代码几款App
- 〖Python 数据库开发实战 - Python与Redis交互篇③〗- 利用 redis-py 实现列表数据类型的常用指令操作
- 〖Python 数据库开发实战 - Python与Redis交互篇④〗- 利用 redis-py 实现集合与有序集合的常用指令操作
- Python学习85:图形界面
- Python爬虫:利用selenium爬取淘宝商品信息
- python 十进制转2进制
- 利用pyinstaller发布不依赖python解释器的可执行exe
- Python可视化数据分析01、python环境搭建
- 【Python】MongoDB数据库安装和Pymongo操作学习
- python的索引与切片
- Python 3 自动化运维之psutil获取系统进程