浅析曼德勃罗集及C++实现图形绘制

       在算法大作业中,认识到了曼德勃罗集(Mandelbrot Set)这一名词,经过网上资料的查阅,才对其思想和独特魅力略知皮毛。由于该集合的定义与分形有关,需要先介绍一下分形的概念。

 

什么是分形(Fractal)?

 

      1967年,美国数学家Mandelbrot曾提出这样一个著名的问题:英格兰的海岸线到底有多长?这个问题在数学上可以理解为:用折线段拟合任意不规则的连续曲线是否一定有效?最终,Mandelbrot1957年提出了分形一词。

 

分形(英语:Fractal),又称碎形、残形,通常被定义为一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状,即具有自相似的性质。——维基百科(wikipedia

 

分形一般具有以下特点:

1.      具有无限精细结构;

2.      比例自相似性;

3.      一般它的分子维数大于它的拓扑维数;(不懂)

4.      可以由非常简单的方法定义,并由递归迭代产生。

 

浅析曼德勃罗集及C++实现图形绘制_第1张图片

                                                                     科赫雪花   


浅析曼德勃罗集及C++实现图形绘制_第2张图片                  

                                                                        谢尔宾斯基三角形

 

什么是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打开,结果如下:

 浅析曼德勃罗集及C++实现图形绘制_第3张图片

迭代次数可间接反映发散程度,本代码中将迭代次数在不同范围内的点进行分层,并赋予不同范围内的点不同的蓝值,由此产生如图效果。读者们可以修改代码设置不同的上色方案,以产生不同的效果。

参考文献

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 

你可能感兴趣的:(C++学习笔记)