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的turtle画分形树

Turtle函数库

【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)的更多相关文章

  1. 【Python 15】分形树绘制3.0(递归函数)

    1.案例描述 将递归函数与循环函数结合绘制2.0的图形 2.案例分析 3.上机实验 """ 作者:梁斌 功能:五角星的绘制 版本:3.0 日期:03/08/2017 新增 ...

  2. Python的并发并行[4] -> 并发[0] -> 利用线程池启动线程

    利用线程池启动线程 submit与map启动线程 利用两种方式分别启动线程,同时利用with上下文管理来对线程池进行控制 from concurrent.futures import ThreadPo ...

  3. 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域

    这是两个相关的程序,前者是后者的基础.实际上前一个程序也是在前面博文的基础上做的修改,请参考<在OpenCV中利用鼠标绘制直线> .下面贴出代码. 程序之一,在OpenCV中利用鼠标绘制矩 ...

  4. 利用JFreeChart绘制股票K线图完整解决方案

    http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) ...

  5. PyQt5利用QPainter绘制各种图形

    这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...

  6. 利用eChart绘制网页图表

    首先,最好的教程在这里:eCchart eChart所需JS: echarts.min.js china.js echarts.js 页面代码如下: 一.图表 <!DOCTYPE html> ...

  7. 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)

    利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...

  8. C#利用GDI+绘制旋转文字等效果

    C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...

  9. <Python Text Processing with NLTK 2.0 Cookbook>代码笔记

    如下是<Python Text Processing with NLTK 2.0 Cookbook>一书部分章节的代码笔记. Tokenizing text into sentences ...

随机推荐

  1. 『Power Hungry Cows A*启发式搜索』

    Power Hungry Cows(POJ 1945) Description FJ的奶牛想要快速计算整数P的幂 (1 <= P <=20,000),它们需要你的帮助.因为计算极大数的幂, ...

  2. TypeScript 基础知识点整理

    一.TypeScript的特点 1.支持ES6规范 2.强大的IDE支持(集成开发环境) 允许为变量指定类型,减少你在开发阶段犯错误的几率. 语法提示,在IDE编写代码时,它会根据你所处的上下文把你能 ...

  3. 一文读懂MapReduce

    Hadoop解决大规模数据分布式计算的方案是MapReduce.MapReduce既是一个编程模型,又是一个计算框架.也就是说,开发人员必须基于MapReduce编程模型进行编程开发,然后将程序通过M ...

  4. RabbitMQ消息队列(五)-安装amqp扩展并订阅/发布Demo(.Net Core版)

    publish发布消息 新建一个Asp.Net Core控制台项目:PublishDemo 安装Nuget包 Install-Package RabbitMQ.Client 添加命名空间引用 usin ...

  5. 简单的SQL注入

    Topic Link http://ctf5.shiyanbar.com/423/web/ 1)测试输入1的时候正常显示 2) 单引号测试输入1'发现存在漏洞(判断为字符型注入) 3) 联合注入测试( ...

  6. centos7忘记root密码

    开机时狂点方向键下(Windows还原习惯了),或者狂点别的键.目的为了不让它进入系统. 方向键移动光标定位在第一行,按e编辑它. 在新界面找到linux16开头的行.→光标到  ro    改成rw ...

  7. aps.net core mvc中使用session

    原因>>用session是想验证 前端输入的验证码和后端存入seesion的是否一致,也可以使用的是TempData[]. 铺垫>> 前端用GetValidateCode()方 ...

  8. Java开发笔记(二十八)布尔包装类型

    前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...

  9. Linux平台安装MongoDB及使用Docker安装MongoDB

    一.Linux平台安装MongoDB MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/downlo ...

  10. 通过hash实现前端路由

    router.js //构造函数 function Router() { this.routes = {}; this.currentUrl = ''; } Router.prototype.rout ...