昨天上电脑课闲的没事干就想试试能不能用python画分形曲线,于是就有了这篇博客的内容啦~
也许有些读者(好吧,并没有读者读这破博客)不了解什么是分形,我引用一下百度百科的定义:
分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。而具有自相似性质的曲线就是分形曲线。
可以看出关键词是“自相似”。
整个程序差不多是这样子的:输入初始线段的坐标,变换方法,输出分形曲线图形。其中变换方法的表示方法多种多样,我这里采用【旋转,路程】的方式。即每个小步相对原始方向向量旋转了多少度,向前走了多少距离。举个例子来说:初始线段(0,0)→(1,0)。变换方法为[[45,根号0.5],[-90,根号0.5]]。那么变换一次后线段就有两段——(0,0)→(0.5,0.5),(0.5,0.5)→(1,0)。
那首先要实现的就是计算一次变换坐标后的函数。这里使用了向量旋转矩阵来完成这件事情。函数需要的输入有初始方向向量,旋转角度,路长,初始点坐标,输出为终点坐标。计算的方式大致就是单位化初始方向向量,乘上旋转矩阵,得到旋转后的单位方向向量。再用旋转后的单位方向向量乘上路长得到起点到终点的向量,最后加上起点坐标得出终点坐标。
其次就是实现迭代一次分形的函数。函数需要的输入有初始线段集合,变换方法,输出迭代一次后线段的集合(列表)。其实就是循环,把线段集合中的每个线段都执行一次变换方法,再根据终点坐标得出分形曲线新的线段。这里要注意,由于方法可以是包含多个的,所以对方法还需要一个子循环。
随后就是多次迭代分形曲线的函数啦,函数需要的输入有初始线段集合,变换方法和迭代次数。利用一下递归的思想会很方便。
最后就是要画曲线。由于我也不要求太好看,就用python自带的tkinter模块中的canvas画布画就行了,想要好看的可以使用别的绘图库。理论上来说也可以话动态的,记得插值一下,每帧刷新频率、刷新内容弄弄清楚就行啦~
最后最后附上代码和一些画出来的分形曲线:(想传github太懒,传本地显示方式也不友好,之后再弄把)→_→
https://github.com/RainbowHerry/python_stuff_of_mine/blob/master/fractal.py

写在最后:
嘛……其实我学python的最初目的就是想画分形曲线。当时的我(高三暑假)啥都没写过,代码会写一点,但是一些概念(什么类、int类型,嵌套这种)都不知道,也就稀里糊涂这么用着了。本来是想用易语言实现的,但是那个时候正好有个同学也在学python,正好那段时间对分形很感兴趣,于是就像学python来画分形……然后看不明白,我就弃坑了……没想到大学开学正好有python课,就学了一下→_→于是就用所学弄出了这个东西,也算是实现了我的目的~真的想不到能填上这个坑,开心一下~



