【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)

时间:2021-04-09 23:25:07

 1.案例描述

树干为80,分叉角度为20,树枝长度小于5则停止。树枝长小于30,可以当作树叶了,树叶部分为绿色,其余为树*分设为棕色。

【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)

2.案例分析

【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)

由于分形树具有对称性,自相似性,所以我们可以用递归来完成绘制。只要确定开始树枝长、每层树枝的减短长度和树枝分叉的角度,我们就可以把分形树画出来啦!!

递归基本逻辑(原路返回):右侧树枝绘制递出处理+左侧树枝绘制递出处理+归来时处理(递出和归来两个模型结合)。最大优点是逻辑容易理解,最大缺点是重复操作较多易有性能问题。

3.分形几何学

客观事物具有自相似的层次结构,局部与整体在形态、功能、信息、时间、空间等方面具有统计意义上的相似性,称为自相似性。自相似性是指局部是整体成比例缩小的性质。

【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)

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&period;0(递归函数)

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

  2. Python的并发并行&lbrack;4&rsqb; -&gt&semi; 并发&lbrack;0&rsqb; -&gt&semi; 利用线程池启动线程

    利用线程池启动线程 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&gt ...

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

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

  8. C&num;利用GDI&plus;绘制旋转文字等效果

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

  9. &lt&semi;Python Text Processing with NLTK 2&period;0 Cookbook&gt&semi;代码笔记

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

随机推荐

  1. Angular初学

    简介: angularjs是基本js开发的一个前端类库,主要致力于减轻开发人员在开发Ajax应用过程中的痛苦,适合来做单应用. 客户端模板: Angualr中,模板和数据都会被发送到浏览器中,然后在客 ...

  2. FLEX的动画

    1.使用自带效果 在Flex里面不像在Flash里面随意制作动画了,Flex更趋向于应用程序,而不是动画制作了,所以没有了时间轴的概念.在Flex中使用动画效果,可以用Flex自带的Effect,或者 ...

  3. 采用ETL with RDBMS模式来实现ETL

    目前Teradata数据仓库的ETL作业采用ELT方式, 因为loading太重了, 需要将ETL压力转移到专门的ETL Server上. 对于ETL工具, 市场上已有很成熟的商业/开源工具, 比如I ...

  4. C&num;基础--&period;net平台的重要组成部分以及&period;net程序简单的编译原理

    .net平台的组成只要有两部分   FCL:框架类库    CLR:公共语言运行时 .net程序简单的编译原理 1.0:使用C#编译器(csc.exe) 将C#源代码编译成程序集+{编译之前:会检查C ...

  5. Android:控件的对象修改控件的值

    TextView private TextView textView; ... textView =(TextView)findViewById(R.id.textView); textView.se ...

  6. Swift基本语法以及与OC的比较

    一.注释: 1.单行注释和OC一致. 2.块注释中有与OC不同点:可以嵌套注释 二.常量和变量: 1.常量:初始化后可读不可写 let 2.变量:初始化后可读可写 var //不需要指定类型,系统会自 ...

  7. centos 下安装ati显卡驱动方法

    1)到ati的官网(http://support.amd.com/us/gpudownload/Pages/index.aspx)下载相应的驱动,一定要注意 radeon系列和mobility rad ...

  8. oracle 10g WMSYS&period;WM&lowbar;CONCAT 函數的用法

    select t.rank, t.Name from t_menu_item t; 10 CLARK 10 KING 10 MILLER 20 ADAMS 20 FORD 20 JONES 20 SC ...

  9. python -- 装饰器的高级应用

    装饰器和装饰器模式装饰器模式是面向对象的一种设计模式,支持将行为动态增加到已经存在的对象上.当装饰一个对象的时候,就表示独立与其他类实例对象,为该对象扩展了新的功能. python的装饰器不是装饰器模 ...

  10. Google Dremel数据模型详解&lpar;下&rpar;

    "神秘"的r和d 单从数据结构来看的话,我们可以这样解释r和d的含义.r代表着当前字段与前一字段的关系,是在哪一层合并的,即公共的父结点在哪?举例来说,假如我们重建到了Code=' ...