Scratch编程学数学之米拉分形——繁花似锦
一、项目的来由
前不久在B站看到有位UP主介绍用几何画板画一个叫“米拉分形”的视频,引发了我的兴趣,我们不妨用Scratch编程来试一试? 因为此前也做过“上帝的指纹”曼德勃罗特集,也画过渔网状的美图。

曼德勃罗特分形(左)和渔网图形(右)
没想到做出来达到了超乎预期的效果!先来几张单图看看,后面还有更酷炫的!

这个所谓的“米拉分形”似乎不是那种很正统的分形图,但是有那么点儿相似的味道,说是分形也不为过。它的问题模型有点像渔网图,是通过坐标递推实现迭代的。其迭代主函数关系虽然是非线性的,但表达式也并不复杂,一个二次分式函数而已。
主函数和坐标递推关系如下图

二、算法分析和相应程序积木
对于这种坐标递推迭代关系的问题,通常用循环或者递归来实现。
(一)首先我们用循环来试一试吧。
1.不管哪种算法,首先要建立一个实现主函数的子程序积木。这里使用了逐步赋值的方法,先求分式值再求和,程序显得简洁不冗长。

求MIRA函数值的子程序
2.第二步,建立坐标值递推迭代的子程序,由于Scratch没有返回值功能,因此在建立求函数值的子程序时,都要把返回值放在一个变量里面,使用函数值时,先调用运行子程序,再把变量中的返回值取出来用。这里也一样用这个方法。

坐标迭代子程序
3.描图程序,就是一个循环,次数就是迭代的深度。每迭代一次,就把迭代子程序里面算出来的坐标值x和y,用来当坐标描点。只不过要将这些坐标值适当的放缩,这里主要是适度放大,不然图像就不可见。因此需要一个放大系数P。适当对画笔颜色做些配置。

画MIRA分形的子程序
4.剩下的就是主程序,设置参数,调用画图子程序来画图了。这里要注意,参数b要是非常接近1的小数好一些,但等于1也麻烦,a的绝对值超过1的话,坐标点发散,成图不佳。值初始值也要影响图形形状,它们都等于0时比较极端,缩成了一点。



画MIRA分形图的主程序和图形
(二)要用递归实现这个目标,只需要对循环程序做一些改变即可。

画MIRA分形的描图递归子程序

调用递归子程序画的MIRA分形图

两个MIRA图的组合
三、拓展:看来参数的微小变化,都有可能带来图的形状有大变化。而且参数众多,这样MIRA图多姿多彩的可能性很大。能不能编写一个展示丰富多彩的MIRA图的动画程序呢?能不能让多个MIRA图形堆叠在同一屏幕上形成烟花绽放的盛景呢?这又要用到随机函数、画笔的檫除功能等等。后面我们将用运行程序录屏的方式来呈现这个状态,看看会不会有更大的惊喜?真是数学之美,美不胜收!敬请期待~

多图堆叠的案例