浅析曼德勃罗集及C++实现图形绘制
在算法大作业中,认识到了曼德勃罗集(Mandelbrot Set)这一名词,经过网上资料的查阅,才对其思想和独特魅力略知皮毛。由于该集合的定义与分形有关,需要先介绍一下分形的概念。
什么是分形(Fractal)?
1967年,美国数学家Mandelbrot曾提出这样一个著名的问题:英格兰的海岸线到底有多长?这个问题在数学上可以理解为:用折线段拟合任意不规则的连续曲线是否一定有效?最终,Mandelbrot在1957年提出了“分形”一词。
分形(英语:Fractal),又称碎形、残形,通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。——维基百科(wikipedia)
分形一般具有以下特点:
1. 具有无限精细结构;
2. 比例自相似性;
3. 一般它的分子维数大于它的拓扑维数;(不懂)
4. 可以由非常简单的方法定义,并由递归迭代产生。
科赫雪花
谢尔宾斯基三角形
什么是Mandelbrot集合?
Mandelbrot集合是在复平面上组合分形的点的集合,正是以数学家Mandelbrot的名字命名。
Mandelbrot集合可以由复二次多项式
来定义。其中是一个复参数,对于每一个,从开始对进行迭代,从而可以得到序列
该序列中元素的模,或者延伸至无穷大(发散),或者停留在有限半径的圆内(收敛)。而Mandelbrot集合正是使该序列中所有元素的模均收敛的点的集合。
例如,当时,通过迭代得到的序列为(0,1,2,5,26…),显然该序列中元素的模会趋于无穷大;当时,通过迭代得到的序列为, 所有元素的模一直停留在有限半径的圆内。
事实上,一个点属于Mandelbrot集合当且仅当它对应的序列中的任何元素的模都不大于2。(我也不知道为什么,总之这就是后面代码实现中的关键)
算法实现流程
1. 创建PPM图像文件(通过RGB三种颜色显现的图像),图像中的像素可作为坐标轴当中的点,并给定原点坐标;
2. 定义迭代函数,用以检验某个点是发散还是收敛;
3. 检验图像中的每一个点(像素),并对收敛和发散的点进行不同的着色处理,绘制形成目标图像。
实现代码
https://gitee.com/CharlesLovesCoding/Mandelbrot-Set 代码由同济大学MPC同学提供
代码运行生成的PPM文件可用Photoshop或者XnView打开,结果如下:
迭代次数可间接反映发散程度,本代码中将迭代次数在不同范围内的点进行分层,并赋予不同范围内的点不同的蓝值,由此产生如图效果。读者们可以修改代码设置不同的上色方案,以产生不同的效果。
参考文献
1. 分形-维基百科:https://zh.wikipedia.org/wiki/%E5%88%86%E5%BD%A2
2. 曼德博集合-维基百科:https://zh.wikipedia.org/wiki/%E6%9B%BC%E5%BE%B7%E5%8D%9A%E9%9B%86%E5%90%88