用Python绘图,感受编程之美冬日里,树叶都已落下,还好可以用Python,重现银杏树的美

用Python绘图,发现编程之美

冬日里,树叶都已落下,还好可以用Python,重现银杏树的美

昨日的雪,提醒着我冬天已到,这让我更加怀念京城的秋景。北京的秋天除了看红叶就要属赏银杏了,美丽的银杏树总是让人百看不厌。满眼的金黄映着秋日的暖阳美极了。

美丽的银杏银杏特写

银杏树,可算是活化石,恐龙也曾目睹过他的风姿。同时银杏又是“晚熟晚育”,一棵银杏树苗长成大树结果,需要几十年时间,所以有爷爷种树,孙儿乘凉的说法。因此银杏又被称作公孙树。

可惜北京的秋天总是稍纵即逝。叶子总有落下掉没的一天。我想到也许可以用Python编程,模仿银杏的美。用Python的Turtle绘图函数库,随时都可以看到漂亮的银杏树。

我的设计思路

我的想法是:分成3个部分。1、画树叶 2、画树干和树枝 3、加特效(光影和飘落效果),下面我从这三部分分别介绍:

1、画树叶

如果仔细看一下银杏树叶的特写,其是银杏叶有一个很复杂的结构。不是简单的一个扇面,叶片的轮廓其实是由多个弧形连续组成。而且中间还会有个很大的分叉。真实的银杏叶

当然我这里用了简化思维,降低了难度,我把银杏看成是由三个弧形构成,最终完成一个闭合的形状。

代码实现lv.begin_fill()

lv.circle(10, 120)   # 画一段120度的弧线

lv.penup()            # 抬起笔来

lv.goto(px, py)         # 回到圆点位置

lv.setheading(an+90)     # 向上画

lv.pendown()          # 落笔,开始画

lv.circle(-10, 120)  # 画一段120度的弧线

lv.setheading(an+100)

lv.circle(15, 150) 画一段150度的弧线,围一个形状即可

lv.end_fill()#叶子的效果

2、画树干和树枝

树干和树枝要麻烦很多。首先树干走向和枝条的分布,好像并没有规律可循。如果完全按照小象学院介绍的使用分形树(即利用递归函数,不断调用自身,你可以理解为套娃),可能会看起来不太自然。真实的树不可能如此的对称。(不是所有的节点都需要分叉)普通的分形树

用什么方式可以近似模拟自然树的分叉方式。或者看上去自然一些呢??这时我想到了意大利一位伟大的数学家,斐波那契。据说他是在观察一窝兔子产子数量规律时,发现了伟大的斐波那契数列。该数列特性很多,最根本一条:从第三项起,任何一个数字均是其前两个数字的和数。在大自然界中和日常生活中能看到很多这样的例子比如:依照黄金分割率画出的螺旋形其实也是符合斐波那契数列的。其实自然生长的树的分叉规律也可以套用这个数列。如下图所示,是不是看着自然得多。斐波那契数列在树上的应用

我们可以利用斐波那契数列的定义,通过循环得出。并存储在一个列表中。代码实现:def Fibonacci_Recursion_tool(n):

if n <= 0:

return 0

elif n == 1:

return 1

else:

return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2)

def Fibonacci_Recursion(n):

result_list = []

for i in range(1, n + 3):

result_list.append(Fibonacci_Recursion_tool(i))

return result_list

之后就是精华。我自己想出来的哈哈。通过变量level,得到当前层数,然后套用该层的斐波那契数列,每画一个分支都对该层的数列做减一操作并给开关变量取反。这样保证每层分叉数量可以满足斐波那契数列。同时我在是否画树枝上还加了随机判断,这样保证我的树形不会太单调。

代码实现if  level==top and x==5 :

turtle.forward(length)  # 画树枝

yu[level] = yu[level] - 1

c=random.randint(2,10)

for i in range(1,c):

leaf(turtle.xcor(), turtle.ycor(), node)

elif level>3 and (x==8 or x==3) :

turtle.pendown()

turtle.forward(length)

c = random.randint(4, 6)

for i in range(3, c):

leaf(turtle.xcor(), turtle.ycor(), node)

leaf(turtle.xcor(), turtle.ycor(),node)

button=1# jump"""终结下面的递归

else:

turtle.forward(length)  # 画树枝

yu[level] = yu[level] -1

if node>0 and button==0:  # 开始执行递归

3、画光影特效和飘落效果

光影特效这部分主要参考了网友的帖子,将画笔的角度转换为改变RGB颜色值的参考系。

代码实现t = cos(radians(turtle.heading()+5)) / 8 + 0.25

turtle.pencolor(t*1.6, t*1.2, t*1.4)

飘落效果这部分也是参考了网友的帖子,我的主要贡献是把他原来为python2.0语法写的代码,用3.0重写了一遍。(大言不惭)�

代码实现if random.random() >0.5:

turtle.penup()

# 飘落

t1 = turtle.heading()

an1 = -40 + random.random() * 40

turtle.setheading(an1)

dis = int(800 * random.random() * 0.5 + 400 * random.random() * 0.3 + 200 * random.random() * 0.2)

turtle.forward(dis)

turtle.setheading(t1)

turtle.right(90)

# 画叶子

leaf(turtle.xcor(), turtle.ycor(), node)

turtle.left(90)

# 返回

t2 = turtle.heading()

turtle.setheading(an1)

turtle.backward(dis)

turtle.setheading(t2)

最终看效果,每次只需要输入节点数量和主干长度就可以随机画出一棵还算自然的银杏树

做好的效果

长按扫码关注

python画树叶-用Python绘图,感受编程之美相关推荐

  1. python画树叶-使用Python turtle画分形树叶图

    关于使用Python的turtle画树叶的代码. 感兴趣的可以自己了解一下分形树叶的数学几何原理--含概率的迭代函数系统.代码不难,关键是数学原理哦~还有,绘制过程有助于对代码和数学原理理解,大家动手 ...

  2. python画树叶-用python画树叶

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. draws a 叶子 and fill it. t.begin_fill ...

  3. python画鱼教程_Python Flask高级编程之从0到1开发《鱼书》精品项目 学习 教程??

    一 .安装环境 我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移. $ pip install flask $ pip install SQ ...

  4. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  5. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  6. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  7. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  8. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  9. python画函数曲线-python画蝴蝶曲线图的实例

    蝴蝶曲线是由Temple H・Fay发现的可用极坐标函数表示的蝴蝶曲线. 由于此曲线优美, 因此就想把它作为博客favicon.ico,这里我使用pytho matplotlib.pyplot包来绘制 ...

最新文章

  1. 去年亏11亿的寒武纪拟科创板募资28亿:三年总营收5.68亿,99%客户来自国内,曾从华为海思挖来CTO...
  2. centos 6.3 x86_64安装32位JDK的问题
  3. cocos2d-x游戏实例(1)-视角跟随主角
  4. python机器学习入门实例-老司机学python篇:第一季(基础速过、机器学习入门)
  5. Android音视频开发全系列教程
  6. 手机测试的主要测试内容
  7. 西工大计算机课程表,工大、高新、交大、爱知等7所名校初一作息时间表课表新鲜出炉!...
  8. 信息学奥赛一本通 铲雪车
  9. java编写安卓计算器_安卓实现简单计算器
  10. 如何制定客户留存策略_运营参考|促活、拉新、留存、变现,7种策略教你做好用户运营...
  11. 微信小程序canva生成图片,长按图片识别小程序二维码详解
  12. CDA深度分享:数据自由之路——数据产品及数据分析职业发展路径
  13. 关于少儿编程编程语言的选择,python还是c++
  14. JavaScript通过下标获取对象(字典)指定键和值
  15. flutter tabBar 选项卡自定义指示器
  16. Fatal message conversion error; message rejected; it will be dropped or routed to
  17. Java:获取当前日期当前季度、上一季度开始结束日期时间
  18. 河南计算机二级报名的流程,2020年9月河南计算机等级报名程序是什么
  19. Python+Selenium 实现新理念外语网络教学平台 自动答英语听力 -- 山东科技大学
  20. 阿里巴巴-鹿班实验室算法实现系列

热门文章

  1. Apache commons 实用方法整理(持续更新中)
  2. python爬虫-豆瓣爬取数据保存为html文件
  3. RNA-seq的标准化方法罗列
  4. 为什么选择.NETCore
  5. Android 引入库报错 Null extracted folder for artifact 解决方案
  6. 阿里巴巴:大数据总动员
  7. PBOC2.0-PBOC3.0主要差异
  8. LoadLibrary
  9. 狼人杀 php,狼人杀新手笔记
  10. 强大的arm板——cortex架构系列介绍