由于专栏代码无法高亮,为了美观我就直接从csdn截图了,想复制代码可以去我的csdn,对应文章:https://blog.csdn.net/python1639er/article/details/104038495
1、谢尔宾斯基三角形
谢尔宾斯基三角形(Sierpinski triangle),
是一种如图所示的分形
这里分析一下其绘制过程
1、绘制一个三角形
2、取三角形的三边中点,
以每两个中点及其所在边共有的顶点,
三个一组,组合成三个小三角形,
对三个三角形进行绘制,
如下图所示,分别为ADF,DBE,FEC。
3、对2中的三个小三角形,重复步骤2。
理论上,步骤二可以无限重复下去,但是代码而言,要保证算法的有穷性,所以一般都是将步骤二运行有限次数之后结束。
2、结合递归三原则编写代码
首先,需要添加方法draw_sierpinski来绘制指定层数的谢尔宾斯基三角形
这里再解释下depth这个层数的具体意思,即上面的步骤二执行的次数
那么下图从左到右,层数分别为:0,1,2,3,4
然后我们再分细下draw_sierpinski方法应该怎么写绘制三角形triangle
如果层数depth为0则退出递归
取三角形中点,及对应形成的三个小三角形,
对这三个三角形,分别再次调用draw_sierpinski方法,绘制depth-1的谢尔宾斯基三角形
为了实现上面四步,我们需要添加两个辅助方法
get_midpoint(a,b): 返回a,b两点的中点坐标
draw_triangle(a,b,c) : 以a,b,c为顶点绘制三角形
最终代码如下
运行效果如图
然后我们结合代码回顾一下递归三原则
如图所示:
这里补充一点,递归三原则的2和三常常是一起进行的,
即在向1中的基础情况靠拢的的情况下调用递归方法本身
3、最后补充:
问题1:没有颜色的变化
本人在b站的关于这个谢尔宾斯基三角形视频教程最终代码如步骤二中所示,但是有个小小的细节问题,就是不同层数的三角形之间没有颜色的变化,与本文开头的图一不符。所以最后还是要添加一下颜色的处理
问题2:最终运行结束后中间有黑点
大家看步骤二重最后运行效果图,中间有个黑点, 这个黑点是turtle画笔对象,一般是箭头样式,放在中间破坏了整个画面,隐藏掉就好了
解决问题一二后代码如下
此时运行效果如图
问题3:线条重画导致粗细不一
如果有朋友观察细致的话,会发现一些边线有时有粗细不一的情况,如下图。
这是由于每次重复绘制过程的第二步时,边线也被重复绘制了,但是重复绘制有时候并不一定和原来的边线是绝对齐的,这种反复不齐导致整个线条实际上是有多个不完全一致的线段叠起来的,所以看上去会有粗有细。
实际上,步骤二为了让大家简单直接的理解递归,所以选择了重复绘制边线这种方便递归的方法来画谢尔宾斯基三角形,方便的缺点就是重画边线导致不齐的线段叠加,当然这个缺点对于初学者完全可以忽略。
如果我们要解决这个问题,实际上就需要调整我们的绘制过程,修改原来绘制过程中的步骤二,不过这会使递归略微麻烦一点点。
具体的可看我以前博客园写的文章,这篇文章里就用的是另外一种绘制过程,来避免了重复画线:https://www.cnblogs.com/BigShuang/p/10837020.html
我就不搬运过来了。