【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)
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 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)的更多相关文章
- 【Python 15】分形树绘制3.0(递归函数)
1.案例描述 将递归函数与循环函数结合绘制2.0的图形 2.案例分析 3.上机实验 """ 作者:梁斌 功能:五角星的绘制 版本:3.0 日期:03/08/2017 新增 ...
- Python的并发并行[4] -> 并发[0] -> 利用线程池启动线程
利用线程池启动线程 submit与map启动线程 利用两种方式分别启动线程,同时利用with上下文管理来对线程池进行控制 from concurrent.futures import ThreadPo ...
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
这是两个相关的程序,前者是后者的基础.实际上前一个程序也是在前面博文的基础上做的修改,请参考<在OpenCV中利用鼠标绘制直线> .下面贴出代码. 程序之一,在OpenCV中利用鼠标绘制矩 ...
- 利用JFreeChart绘制股票K线图完整解决方案
http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) ...
- PyQt5利用QPainter绘制各种图形
这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...
- 利用eChart绘制网页图表
首先,最好的教程在这里:eCchart eChart所需JS: echarts.min.js china.js echarts.js 页面代码如下: 一.图表 <!DOCTYPE html> ...
- 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)
利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...
- C#利用GDI+绘制旋转文字等效果
C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...
- <Python Text Processing with NLTK 2.0 Cookbook>代码笔记
如下是<Python Text Processing with NLTK 2.0 Cookbook>一书部分章节的代码笔记. Tokenizing text into sentences ...
随机推荐
- 【朝花夕拾】Android性能篇之(二)Java内存分配
前言 在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给了JVM来处理了,而不需要手动在代码中去完成.有了虚拟机内存管理机制,也就不 ...
- Java基础19:Java集合框架梳理
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
- Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...
- C-sizeof和strlen区别,以及sizeof如何计算结构体大小
sizeof和strlen区别 sizeof是关键字,在编译时就能计算出值,可以计算任何类型 strlen是函数,只有在运行时才能去计算,且只能计算字符型的. 对于数组时,strlen是判断’\0’为 ...
- 6-Redis 的持久化之 AOF
2017-01-01 16:42:13 该系列文章链接NoSQL 数据库简介Redis的安装及及一些杂项基础知识Redis 的常用五大数据类型(key,string,hash,list,set,zse ...
- springboot之JdbcTemplate
springboot可以使用JdbcTemplate进行数据库访问,代码如下 添加pom文件 <parent> <groupId>org.springframework.boo ...
- (二)阿里云ECS Linux服务器外网无法连接MySQL解决方法(报错2003- Can't connect MySQL Server on 'x.x.x.x'(10038))(自己亲身遇到的问题是防火墙的问题已经解决)
我的服务器买的是阿里云ECS linux系统.为了更好的操作数据库,我希望可以用navicat for mysql管理我的数据库. 当我按照正常的模式去链接mysql的时候, 报错提示: - Can' ...
- 基于element-tree-table树型表格点击节点请求数据展开树型表格
效果: 引用CSS.JS: Vue.element-ui.Axios treeTable: https://github.com/ProsperLee/element-tree-grid 模拟根据父i ...
- .net mvc session失效问题
最近解决基于.net mvc项目的session失效问题,这个跟大家聊聊. 1.问题分析 .net mvc中,Session失效需要考虑几种情况: 基于权限认证的Action,使用非Ajax请求: 基 ...