绘制分形树

1.1题目描述

如下图所示,先垂直绘制一根线段,然后在线段长度的三分之一处和三分之二处分别以固定夹角绘制另外两根线段,长度分别为原线段的2/3和1/3. 如此反复,直至线段长度小于某个较小的值。其中,线条颜色以及长度,夹角都可以自行进行微调。

1.2 问题分析与解决思路

1.2.1 问题分析

问题需要解决如何绘制分形树?可以将绘制过程分解一下,然后去分析。
这是绘制的第一步:

可以发现,绘制这样的图,需要获取原始线段的长度,然后取线段的三分之一及三分之二长度,然后将线段的左右划分为左右部分,先绘制线段左边或右边的线段,再绘制另一边,就可以绘制出来了。
然后继续绘制分支:(可以用三角函数cos,sin来实现定位)

由图可以发现,树杈上的分叉跟上图的是一模一样的,这说明分叉的绘制可以调用绘制上图的绘制过程。不断地调用,直到满足一个什么条件时就停止绘制。

1.2.2解决思路

通过对问题的分析,采用递归思路解决该问题。(也可以用分形算法解决)
我们先考虑画主干,首先画一个垂直的线段,然后选取线段的三分之一位置绘制一根长度为原线段的三分之一的角度为多少的线段,然后再选取线段的三分之二位置绘制一根长度为原线段三分之二的角度为多少的线段(从上往下算的长度,在三分之一位置向左旋转角度,在三分之二位置向右旋转角度)。
然后分支,通过对主干绘制的过程的递归调用来实现。

1.3 模型建立与算法描述

为了简单解决问题,我采用一笔一画的方式,而没有通过起点与终点连接的方式。
记树的初始长度为len,旋转的角度为angle
我们将上述分析过程和解决思路进一步归纳为以下步骤:
(1)绘制主干线段,回到主干位置的1/3位置
(2)向左旋转角度,绘制左分支
(3)重复(1),(2)步,递归绘制长度为主线段的1/3,角度为angle的左分支,直到长度小于某个值,执行下一步
(4)回到初始长度的2/3位置
(5)向右旋转角度,绘制右分支
(6)重复以上步骤,递归绘制长度为主线段的2/3,角度为angle的分支,直到长度小于某个值,执行下一步
(7)转回正方向,回到起点。
算法伪代码描述:

算法 fractalTree(len,angle)
//使用递归算法实现分形树
//输入:分形树的初始长度len,旋转角度angle
//输出:动态实现分形树
int len;
Float angle;
if  len < min://min为终止条件绘制主干;绘制左分支,位置在len的1/3,长度为len的1/3;fractalTree(1/3*len,angle);
绘制右分支,位置在len的2/3,长度为len的2/3;fractalTree(2/3*len,angle)
else:
return//使用始终位置连接的算法伪代码:
Tree(x,y,L,angle)
//每次更新结点坐标
Int x1,y1 //初始位置坐标
Int x2,y2 //终止位置坐标
Int x2L,y2L//左子树坐标
Int x2R,y2R//右子树坐标
Int L // 初始主干长度
Float angle //旋转角度,可以通过math.pi函数设置,也可以自定义
if  L>min://终止条件
x2=x1+(L*math.cos(angle))
y2=y2+(L*math.sin(angle))
Plot(x1,y1)-(x2,y2)//连接初始及终点位置,画主干
//画右子树
x2R=x1+(x2-x1)/3  //右子树起点
y2R=y1+(y2-y1)/3
Tree(x2R,y2R, L* 2 / , (angle - 30))
//画左子树x2L = x1+ 2 * (x2 - x1) / 3  # 左树枝起点y2L= y1 + 2 * (y2 - y1) / 3Tree(x2L, y2L,L* 1 / 3, (angle + 30))else:
return

1.4 算法实现与复杂度分析

1.4.1 算法实现

算法实现使用的数据结构为树
算法实现的步骤

  1. 画主干
  2. 画左子树
  3. 重复1,2步,直到长度小于某个值
  4. 画右子树
  5. 重复以上步骤,直到长度小于某个值
  6. 结束

1.4.2算法复杂度分析

设T(n)是分形树递归所需的时间,由此T(n)满足以下递推式:

解此递推式可以得出T(n) = O(nlogn)
因此此算法的时间复杂度为O(nlogn)
由于使用了递归法,程序会不断递归,直到满足终止条件为止,所以空间复杂度O(nlogn)。

1.5 程序实现及运行结果分析

角度为60度,长度为360时:

角度为30度,长度为270时:

分析:这是程序运行结果,由turtle的画笔一笔一笔画出来的,运行程序时可以看到绘制过程。通过结果图可以发现每个分支都含有主干结构,这其实就是分形结构的精美之处,局部与整体的相似性(即自相似性)。通过设置终止条件来实现程序递归的结束。

相关代码源码

Algorithm之绘制分形树相关推荐

  1. python 绘制分形树

    # -*- coding: utf8 -*- """ 绘制分形树 """ import turtledeflection_angle = 2 ...

  2. Python小例子——利用递归绘制分形树

    # -*- coding: utf-8 -*- """作者:宇轩亚40功能:利用递归绘制分形树 """ import turtledef d ...

  3. Python递归绘制分形树

    递归函数绘制分形树 分形几何学的基本思想:客观事物具有自相似性的层次结构,局部和整体在形态,功能,信息,时间,空间等方面具有统计意义上的相似性,称为自相似性,自相似性是指局部是整体成比例缩小的性质. ...

  4. Python绘制分形树

    Python绘制分形树 任务要求 1.树干初始长度为50. 2.每次绘制完成树枝时,画笔右转20度. 3.绘制下一段树枝时,长度减少15,.重复2-3操作直至终止. 4.终止条件:树枝长度小于5,此时 ...

  5. 使用turtle库绘制分形树、太阳花、五角星

    1.太阳花的绘制 import turtleturtle.pencolor('red') # 画笔颜色 turtle.fillcolor('yellow') # 填充颜色turtle.begin_fi ...

  6. 「Python海龟画图」利用海龟画笔绘制分形树

    绘制旋转图形 功能要求 利用函数递归绘制由多条直线组成的旋转图形,每条直线的颜色随机产生:并且隐藏画笔.设置画笔的速度.设置画布的背景色. 实例代码 import turtle # 导入海龟模块imp ...

  7. python 画树 递归_python递归函数绘制分形树的方法

    分形几何学的基本思想:客观事物具有自相似性的层次结构,局部和整体在形态,功能,信息,时间,空间等方面具有统计意义上的相似性,称为自相似性,自相似性是指局部是整体成比例缩小的性质. 我们先看一下我们最终 ...

  8. python手动绘图案例_python绘图案例——递归绘制分形树

    运行效果图 案例分析: 1.树干初始值为50 2.每次绘制完树枝后,画笔右转20度 3.绘制下一段树枝时,长度减少15,.重复2--3操作直到终止 4.终止条件:树干长度小于5,此时为顶端树枝 5.达 ...

  9. python绘图案例——递归绘制分形树

    运行效果图 案例分析: 1.树干初始值为50 2.每次绘制完树枝后,画笔右转20度 3.绘制下一段树枝时,长度减少15,.重复2--3操作直到终止 4.终止条件:树干长度小于5,此时为顶端树枝 5.达 ...

最新文章

  1. N-API中的Promise功能的使用
  2. 如何打开MDI文档!
  3. 微信notify mysql_微信支付的notify.php中如何获取订单号(php版)
  4. 7、redis之使用spring集成commons-pool来操作常见数据类型
  5. 20+ 家标杆车企实践总结,数字化转型的秘诀都在这儿
  6. 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览
  7. 详解Oracle DELETE和TRUNCATE 的区别
  8. windows 和linux查看硬件信息,Linux下如何查看硬件信息?
  9. mysql 主从 keepalived_MySQL之双向主从加keepalived高可用
  10. 8成功的用户界面特性
  11. Excel公式与函数实战应用-陈明霞-专题视频课程
  12. 用Matlab处理信号从入门到入土1
  13. Java开源 J2EE框架(一)
  14. java 顺丰电子面单,【第三方API】顺丰电子面单SDK调用总结-java
  15. 日常工作计划安排工具
  16. 华为 MA5680T [EPON]简单开局
  17. man查询括号中的数字含义
  18. 香港云服务器提升性能,香港云服务器提升性能
  19. matlab 固定收益证券,matlab计算固定收益证券学习(二)
  20. 华为OD机试用Python实现 -【查找树中的元素 or 查找二叉树节点】(2023-Q1 新题)

热门文章

  1. Quasar prerender-spa-plugin 踩坑指南
  2. 数据结构c语言描述的习题答案,《数据结构 - C语言描述》习题及答案 耿国华-...
  3. texlive 2021 安装之后双击之后闪退解决
  4. 【TX2】TX2+ubuntu16.04更新源
  5. 用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1
  6. 今天咱们用 Python 将 QQ 好友头像生成祝福语
  7. 基于猿题库网络请求再次封装
  8. C++模板编程(16)---继承与类模板(Derivation and Class Templates)
  9. webrtc的windows编译MDd或MD修改
  10. 人工智能核心技术,主要可以分为哪几类?