前言:
首先先简单介绍一下Mandelbrot集,该集被曼德布罗特教授称之为“魔鬼的聚合物”,也被大家称之为“上帝的指纹”。之所以这么称呼,我想是该集合本身的自相似性及其图像复杂度。然而,如此复杂的图像也只不过是通过一个简单的公式(Z^2 = Z^2 + c)来完成的,当然当年曼德布罗特教授发现这个公式是不容易的。我刚开始接触Mandelbrot集的时候并没有注意到其简单性,只是觉得图像蛮漂亮的,就开始着手了。当时也没有注意到其子集Julia集,最后才发现Julia集与Mandelbrot集是一个公式来的,只是它们的初始条件不同而已。Julia集中,复数c是固定,确切的说是它不随复平面上的坐标变化而变化。而Mandelbrot集中的c是随坐标值改变而改变的。
MandelBrot vs Julia:
下面就切入正题了,刚在前言里也说过Julia集是Mandelbrot集的子集,这也就是说如果把Madelbrot集画出来,再画Julia集就简单多了。Mandelbrot集的图像是一个3:2(这个可以研究一下公式)的图,为了使图像好看些可以按这个比例把它放大,比如说把这个它画在一个600x400的框架中,缩放比例也就是1/200。下面主要是初始化Z^2 = Z^2 + c,c = new Complex((double)x * rate - 2.0,(double)y * rate - 1.0);z = c;然后就是进行公式转化了,即Z^2 = Z^2 + c,直达达到迭代次数或者复数z的模长大于2采跳出循环。迭代次数其实就是放大比例,次数越多放大效果越好,看的也越精细,也会体现出它的自相似。之所以要以模长为2为界限,这个就需要自己研究一下公式了。跳出循环时,如果达到迭代次数就是Mandelbrot集里的,不然就不是了。这样我们就可也找出框架里的点那些是Mandelbrot集里的,那些不是了,说到这里Mandelbrot集也就差不多出来了。下面给出一小段关于画Mandelbrot的代码:
for (int x = 0; x < 600; x++) { for (int y = 0; y < 400; y++) { interation = 0; c = new Complex((double)x * rate - 2.0,(double)y * rate - 1.0); z = c.add(new Complex(0.0,0.0)); //计算模长 length = Math.sqrt(z.re * z.re + z.im * z.im); //判断是否在set内 while (length <= 2 && interation < maxInteration) { //Mandelbrot集 z = z.multiply(z); z = z.add(c); //计算模长 length = Math.sqrt(z.re * z.re + z.im * z.im); interation++; } //如果在set内 if (interation == maxInteration) { g.setColor(Color.BLACK); g.drawLine(x, y + 5, x, y + 5); }else {//如果不在set内 g.setColor(advocate(interation)); g.drawLine(x, y + 5, x, y + 5); } } }
相信画Mandelbrot集已经很简单了,下面开始画Julia集了。
刚才也说过如果已经画出Mandelbrot集,那么Julia集就不用费吹灰之力了。给窗体添加一个鼠标监听器,获取坐标,然后根据坐标就可以得到c了,即c = new Complex((double)x * rate - 2.0,(double)y * rate - 1.0);,然后就是跟画Mandelbrot集相同的步骤了,这里就不多说了,只给出相应的代码了。
public void mouseMoved(MouseEvent e){ x1 = e.getX(); y1 = e.getY(); //System.out.println("x1的值:" + x1 + "y1的值:" + y1); c1 = new Complex((double)x1 * rate - 2.0,(double)y1 * rate - 1.04); for (int x = 0; x < 600; x++) { for (int y = 0; y < heigth; y++) { interation = 0; z1 = new Complex((double)x * rate - 1.5,(double)y * rate - 1.05); //计算模长 length = Math.sqrt(z1.re * z1.re + z1.im * z1.im); //判断是否在set内 while (length <= 2 && interation < maxInteration) { //Mandelbrot集 z1 = z1.multiply(z1); z1 = z1.add(c1); //计算模长 length = Math.sqrt(z1.re * z1.re + z1.im * z1.im); interation++; } //如果在set内 if (interation == maxInteration) { g.setColor(Color.BLACK); g.drawLine(x + 605, y, x + 605, y); }else {//如果不在set内 g.setColor(advocate(interation)); g.drawLine(x + 605, y, x + 605, y); } } } }
下面给张图片:
其实Mandelbrot集可以进行无限放大,放大思想:①选中的区域调整比例为3:2,上下左右缩放一下就可以;
②然后就是把坐标轴改变位置,即把原点移到选中区域中的分叉点上;
③接下来当然是调整缩放比例了,如果不调整的话,也就不是放大了,其实根本也放不大。原先的1/200(3.0/640.0)也就变成(tox - fromx)/ 640.0。tox是选中区域右边横坐标,fromx也就是选中区域左边坐标了。
PS:附件中有.jar文件,可以看看效果,只是Julia集的色彩配的不怎么好
相关推荐
一个分形方面的小程序
绘制Mandelbrot和Julia集的简单Java程序 如何使用 第一个输入参数必须是分形类型(Mandelbrot或Julia)。例如,如果您想要Mandelbrot, java Fractal Mandelbrot 仅提供一个参数将对其他参数使用默认值 您可以给4...
利用MFC平台通过鼠标的单击事件画出一定区域的mandelbrot集和julia集,并将相应的图像以bmp格式保存在桌面上
话不多说。详情参照我的帖子 ...随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后用户可以生成对应的 较高像素数的图片,还可以选中抗锯齿,连续颜色等选项,增强图像的显示效果 ...
画出给定区域,给定图像宽度和长度的mandelbrot集合julia的画法,并把所画出的图形保存到指定的区域
话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后你们可以生成对应的 较高像素数的图片
采用简单的算法绘制Mandelbrot集和Julia集的图像,参数可以自己设置
给出了二次函数的Julia集分形图的概念及逃逸时间算法绘制复杂分形图的基本...该算法同样适用于Mandelbrot集、Sierpinski三角形等其他复杂分形图.试验表明,该算法绘制的Julia集分形图准确有效、优美清晰,算法简单实用.
julia,mandelbrot,分形树的matlab程序~
话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件 最新改动 支持 单线程 ,免得使系统响应变得太慢 以致户没法进行其他操作
用于生成分形形状的应用程序,例如 Mandelbrot Set 和 Julia Sets。 运行Mandelbrot_GUI.m并选择所有参数以进行分形的计算和可视化。
这个 Julia 集类似于 Mandelbrot 集,因为它使用了类似的形式。 但是,这一次是复数 C 的集合,其中 z_n+1 = z_n^2 + d 不会对集合 C 中的所有 c 发散,因为 z_0 = c。 变量 d 是常数和复数。 为了绘制集合,查看...
JLRFractal是使用Trolltech的Qt图形库用C ++编写的Mandelbrot / Julia生成器。 它具有易于使用的缩放功能和对用户可见的加速技术。 颜色循环功能以及保存到文件中
皮曼德尔PyMandel是一个完全用Python 3.8和tkinter 8.6编写的图形化Mandelbrot和Julia Set(及其变体)渲染应用程序,具有元数据导入/导出,基本动画功能以及通过 JIT编译,并行化和缓存的性能增强。 该应用程序在可...
dreamcast-mandelbrot-cube:具有Mandelbrot和Julia纹理的旋转立方体
该项目绘制了非负序的Mandelbrot和Julia集。 曼德布罗集 Mandelbrot集是一组复数c ,当通过函数f(z) = z^2 + c迭代时,它们仍然是有界的。 考虑c = 1 : f(0) = 0^2 + 1 = 1 f(1) = 1^2 + 1 = 2 f(2) = 2^2 + 1 = 5...
MANDELBROT集和JULIA集的分形图之MATLAB实现.doc
很容易在几乎每种语言(包括 Matlab)中找到数十个 Julia 集绘图程序,因此如果您怀疑是否需要另一个具有此目的的应用程序,我不会责怪您。 然而,我的目标是展示探索 Julia 集是多么有趣,并使这个应用程序比现有的...
借鉴一般复动力系统 z2 + c的 M-集及 J-集的对应关系,通过计算机实验方法,给出 了超越函数λcos( z)广义 M集中的点对应广义 Julia集的结构特征,并对 Mandelbrot-集与 Julia-集 之间的关系进行了分析。拓广了普通...