前言:
首先先简单介绍一下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集:C++实现及分形艺术的探索》 Mandelbrot集和Julia集是数学中的两个经典分形,它们在计算机图形学和艺术领域有着广泛的应用。这个压缩包文件包含了用C++语言编写的小程序,用于绘制和探索这...
Mandelbrot集合和Julia集合是分形几何中的两个著名例子,它们在计算机图形学领域有着广泛的应用,尤其在艺术、科学可视化以及数学教育中。这两个集合都是通过复数运算来定义的,并且通常使用迭代算法来生成复杂的、...
绘制Mandelbrot和Julia集的简单Java程序 如何使用 第一个输入参数必须是分形类型(Mandelbrot或Julia)。例如,如果您想要Mandelbrot, java Fractal Mandelbrot 仅提供一个参数将对其他参数使用默认值 您可以给4...
**基于MFC的Mandelbrot集和Julia集的画法** MFC(Microsoft Foundation Classes)是微软提供的一种C++类库,用于构建Windows应用程序,它为开发者提供了丰富的控件和界面元素,使得开发图形用户界面(GUI)变得更加...
话不多说。详情参照我的帖子 ...随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后用户可以生成对应的 较高像素数的图片,还可以选中抗锯齿,连续颜色等选项,增强图像的显示效果 ...
Mandelbrot集合和Julia集合是复杂分析领域中的两个著名概念,它们在数学和计算机图形学中都有着广泛的应用。这两个集合是通过迭代复数函数来定义的,它们的美丽和复杂性吸引了无数数学爱好者和艺术家。 Mandelbrot...
**Mandelbrot集与Julia集:MATLAB开发详解** 在计算机图形学和数学领域,Mandelbrot集和Julia集是两种著名的分形几何形状,它们展现了复杂而美丽的数学之美。MATLAB作为一款强大的数值计算和数据可视化软件,非常...
话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后你们可以生成对应的 较高像素数的图片
**Mandelbrot集与Julia集的分形图MATLAB实现** Mandelbrot集和Julia集是数学中的两个重要概念,属于复数域上的分形几何研究对象。它们通过迭代函数系统来创建复杂的、自相似的图形,展示了分形理论的魅力。 **1. ...
标题中的“julia, mandelbrot, 分形树的matlab程序”表明这是一个关于使用MATLAB编程实现Julia集合、Mandelbrot集以及分形树的项目。MATLAB是一种广泛使用的数值计算和可视化软件,非常适合进行复杂数学图形的绘制,...
**MATLAB源码详解:构建Mandelbrot集与Julia集** 在计算机科学和数学领域,Mandelbrot集和Julia集是分形几何中的两个重要概念,它们通过迭代复数运算来生成复杂的图形。MATLAB作为一款强大的数值计算软件,常被用于...
给出了二次函数的Julia集分形图的概念及逃逸时间算法绘制复杂分形图的基本...该算法同样适用于Mandelbrot集、Sierpinski三角形等其他复杂分形图.试验表明,该算法绘制的Julia集分形图准确有效、优美清晰,算法简单实用.
JLRFractal是一款基于C++编程语言,并利用Trolltech的Qt图形库构建的Mandelbrot和Julia集生成器。这款开源软件允许用户探索和欣赏这两种著名的分形图形,同时提供了丰富的交互性和性能优化。 **Mandelbrot集与Julia...
话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件 最新改动 支持 单线程 ,免得使系统响应变得太慢 以致户没法进行其他操作
这个 Julia 集类似于 Mandelbrot 集,因为它使用了类似的形式。 但是,这一次是复数 C 的集合,其中 z_n+1 = z_n^2 + d 不会对集合 C 中的所有 c 发散,因为 z_0 = c。 变量 d 是常数和复数。 为了绘制集合,查看...
皮曼德尔PyMandel是一个完全用Python 3.8和tkinter 8.6编写的图形化Mandelbrot和Julia Set(及其变体)渲染应用程序,具有元数据导入/导出,基本动画功能以及通过 JIT编译,并行化和缓存的性能增强。 该应用程序在可...
该项目绘制了非负序的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