`
原非珏
  • 浏览: 9835 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

分形之Julia集和Mandelbrot集及浅谈分形理论的应用

 
阅读更多
首先要show一把这俩个集合的图片


很漂亮是吧~不过很遗憾这不是我做的,但本人还是有画比较简单的两个集合的图形,有待指教改进。不过在此之前应该先简单介绍一下这两个集合,Mandelbrot集是通过迭代方程Zn+1=(Zn)^2+Zc,其中数Zc=0,Zn是一个复数。我们定义Mandelbrot集是所有复数Zc的集合,这样当n趋于无穷时Zn是有限的,如果超过2, Zn不会是有限的。例如我们想要的颜色像素(-1,0.5),以Zc = -1 +0.5i和Z0= 0开始,则有:
Z1 = Z0^2+Zc = -1+0.5i;
Z2 = Z1^2+Zc = -0.25-0.5i; 
Z3 = Z2^2+Zc = -1.1875+0.75i;
Z4 = Z3^2+Zc = -0.1529344-1.28125i;
Z5 = Z42+Zc = -2.61839+0.890381i;
``````
我们停在这里因为大小| Z5| = 2.76564> 2。我们得出这样的结论:这一点是无界的且迭代次数为5。然后我们再次重复整个过程的每个像素。而Julia集和Mandelbrot集是非常相似的因为所用的迭代方程为同一个Zn+1=(Zn)^2+Zc。然而,不同于上述的根据不同的Zc值绘制像素,我们假设Zc的所有像素是给定的常数,我们绘制不同的 。因此,这有无限的Julia集主要取决于你选择的Zc的取值。例如,我们想要的颜色像素(-1,0.5)的Julia集使用常数Zc = -1.125+0.25i,我们开始以Z0=-1+0.5i;
Z1 = Z02+Zc = -0.375-0.75i;
Z2 = Z12+Zc = -1.54688-0.8125i;
Z3 = Z22+Zc = -0.60767+2.26367i;
``````
我们停在这里,因为大小| Z3 | = 2.34381> 2。我们得出结论,这一点上是无限的和迭代n=3的基础上的像素.
以上的论断我们假设z=x+yi,可得两个集合均要求x^2+y^2<2^2,且对于Julia 集,固定Zc值,把复平面指定区域内的复数点作为初值Z0代入后,迭代过程Zn+1=Zn^2+Zc终止时的迭代次数;对于Mandelbrot 集,它表示固定Z0 值,把复平面指定区域内的复数点作为μ值代入后,迭代过程Zn+1=Zn^2+Zc终止时的迭代次数。写得比较简单,就一个JFrame界面和一个ActionListner监听器,界面部分就不拿出来了,下面是Julia集监听器部分代码
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
 
/**
 * 监听器
 * @author suer
 *
 */
public class CJuliadrawListener implements ActionListener {   
    double p, q;   //Zc=p+qi,p,q的值自己给定
    Graphics g;
    JFrame jf;
    private final int MAX=255;//颜色数值的最大值
	public CJuliadrawListener(Graphics g,JFrame jf){
		this.g=g;
		this.jf=jf;
	} 
	public void actionPerformed(ActionEvent e){
		String s=e.getActionCommand();
		if(s.equals("p=-0.65175;q=0.41850")){
			paint(g,-0.65175,0.41850);
		}else if(s.equals("p=-0.46;q=0.57")){
			paint(g,-0.46,0.57);
		}else if(s.equals("p=-0.8;q=0.156")){
			paint(g,-0.8,0.156);
		}else if(s.equals("p=-0.835;q=-0.2321")){
			paint(g,-0.835,-0.2321);
		}else if(s.equals("p=0.285;q=0.01")){
			paint(g,0.285,0.01);
		}else if(s.equals("p=-0.70176;q=-0.3842")){
			paint(g,-0.70176,-0.3842);
		}
    
	}
	/**
	 * julia集的实部和虚部值的范围
	 * @param x0:初始的实部值
	 * @param y0:初始的虚部值
	 * @return:循环的参数
	 */
    public int cjulia(double x0,double y0){   
        double xk,yk;   
        int i;   
        for (i=0;i<100;i++) {   
            xk=x0*x0-y0*y0+p;   
            yk=2*x0*y0+q; 
            if (xk*xk+yk*yk>4) return i;   
            x0=xk;   
            y0=yk;   
        }   
        return i;         
    }   
    /**
     * 由迭代产生的0.0到1.0的颜色值的方法
     * @param x0:初始的实部值
     * @param y0:初始的虚部值
     * @param p:Zc的实部值
     * @param q:Zc的虚部值
     * @return:颜色参数
     */
    private float punktfarbe(double x0, double y0,double p,double q){
       double xk=0, yk=0;
       int j = 0;
       while((j<MAX)&&(yk*yk+xk*xk< 4.0)){
        xk=x0*x0-y0*y0 + p;
        yk=2.0*x0*y0 + q;
        j++;
        x0=xk;
        y0=yk;
       }
      return (float)j/(float)MAX;
    }
   /**
    * 绘制julia集的方法
    * @param g:画布
    * @param p:Zc的实部值
    * @param q:Zc的虚部值
    */
    public void paint (Graphics g,double p,double q) { 
    	double reZ, imZ, ze0=0.0038; 
    	//double reZ, imZ, ze0=0.0055; 
        int x, y;   
        imZ=-1.5;   
        for (y=0;y<700;y++) {    
        	reZ=-1.5;  
            for (x=0;x<700;x++) {   
                if (cjulia(reZ,imZ)==100) {  
//                	float s=punktfarbe(reZ,imZ,p,q);
//                	float b=1.0f-s*s;
//                	g.setColor(Color.getHSBColor(1,s,b));
//                	float h=punktfarbe(reZ,imZ,p,q);
//                	float b=1.0f-h*h;
//                	g.setColor(Color.getHSBColor(h,1,b));  
//                	float b=punktfarbe(reZ,imZ,p,q);
//                	float h=1.0f-b*b;
//                	g.setColor(Color.getHSBColor(h,1,b));
                	float h=punktfarbe(reZ,imZ,p,q);
                	float s=1.0f-h*h;
                	g.setColor(Color.getHSBColor(h,s,1));  
                    g.drawLine(x+75,y,x+75,y);   
                }   
                reZ=reZ+ze0;    
            }   
            imZ=imZ+ze0;    
        }   
    }   
}

下面是Mandelbrot集的MouseListener监听器部分的代码
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class MandelbrotListener implements MouseListener {  
	private static final double max=1.5;//最大值 
	private static final double min=-1.5; //最小值  
	private static final int Colors=25;  //颜色数 及增长数
	private Graphics g;
	private JFrame jf;
	public MandelbrotListener(Graphics 

g,JFrame jf){
		this.g=g;
		this.jf=jf;
	} 
	public void mouseClicked(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){
    	drawMandel(g);
    }
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public Color[] getColors(){return colors;}   
    /**
     * 颜色设置,rgb的值按colors的数值增长
     */
    private void makeColors(){   
        int maxRGB=255,r=0,g=0,b=0;   
        colors=new Color[Colors+1];   
        for(int i=0;i<Colors;i++){   
            colors[i]=new Color(r,g,b);   
            r+=Colors;   
            if(r>maxRGB){   
                r=0;g+=Colors;   
                if(g>maxRGB){   
                    g=0;   
                    b+=Colors;   
                }   
                if(b>maxRGB)   
                    b=0;   
            }   
        }   
        colors[Colors]=Color.white;   
    }   
    private static Color[] colors;   
   /**
    * 画mandelbrot集的方法,mandelbrot集要注意xstep,ystep,即发散的速度
    * @param g:画布
    */
    private void drawMandel(Graphics g){   
        double xstep,ystep,x,y;   //xstep,ystep是x,y值每次增加的大小
        int i,j,iteration,k=0;   
        double xk,yk,xh,yh,real,imag;;  
        xstep=0.0025;ystep=0.0035;
        for(y=min,j=0;y<=max;y+=ystep,j++){   
            for(x=min,i=0;x<=max;x+=xstep,i++){   
                xk=x;
                yk=y;   
                xh=yh=0.0;    
                for(iteration=0;iteration<Colors;iteration++){ 
                	real=xk+xh;
                	imag=yk+yh;
                	xh=real*real-imag*imag;
                	yh=2*real*imag;
                    if(xh*xh+yh*yh>4)   
                        break;   
                }    
                makeColors();
                g.setColor(colors[iteration]);   
                g.fillRect(i,j,1,1);   
                }   
        }
    }
}

最后要说的是,分形不是几个集合就能代表的,而是一门学问,分形理论的应用也不是局限在画出漂亮的图形而是囊括了很多方面,从大分子到宇宙星系,从自然科学到社会科学,凡是具有自相似性的现象就有分形存在。分形有在物理学中的应用,比如在准晶态的扩散、薄膜的研究、高能粒子碰撞中的阵发现象等,在化学中的应用,例如多相催化体系、宏观化学动力学等,又如植物中树、枝、叶、茎、花、草、蕨、花椰菜等是自然界中最先被认知具有分形维数的物体,材料制备和材料断裂行为等研究,以及用于解释和分析复杂的天文、水文、地质、地理等领域。此外在经济管理学、计算机图形学、复杂产品的分形设计、有限元网格划分的递推模型、制造决策映射建模等方面也有应用。
分享到:
评论

相关推荐

    用MATLAB编写的Julia集和Mandelbrot集分形图案

    在计算机图形学和数学领域,Julia集和Mandelbrot集是两个非常著名的分形图形。它们由法国数学家Benoît Mandelbrot在20世纪80年代提出,成为了分形几何研究的标志性例子。MATLAB作为一种强大的数值计算和可视化工具...

    分形集生成算法,julia集,mandelbrot集生成算法

    本主题将深入探讨两个著名的分形集——Julia集和Mandelbrot集,以及如何通过算法生成它们。我们将讨论这些集合的基本原理、生成算法以及三维Mandelbrot集的实现。 首先,让我们了解什么是分形。分形是一种具有自...

    分形理论及其应用-朱华,姬翠翠-科学出版..

    本书共分为10章,每一章都深入浅出地介绍了分形理论的基本概念和应用。第1章主要介绍分形几何的基本概念和性质,以及分形之父Mandelbrot的生平和分形理论的创立过程。第2章详细介绍了分形维数的基本概念和计算方法。...

    Mandelbrot集和Julia集.rar_ Mandelbrot_Julia C_Julia集_Mandelbrot_Man

    Mandelbrot集和Julia集是数学中的两个经典分形,它们在计算机图形学和艺术领域有着广泛的应用。这个压缩包文件包含了用C++语言编写的小程序,用于绘制和探索这两个神秘的集合。 首先,让我们深入了解Mandelbrot集。...

    c++画分形之Julia集

    分形是一种在数学和艺术中具有广泛应用的几何形状,它们展现出自相似性和无限细节。其中,Julia集合是复平面上的一个点集,与著名的Mandelbrot集合有密切关系。本文将深入探讨如何使用C++编程语言来绘制Julia集合。 ...

    Mandelbrot集和Julia集的分形图之matlab实现.pdf

    Mandelbrot集和Julia集的自相似性体现在,无论放大多少倍,它们的局部结构都与整体保持相似,这是分形的基本特性之一。例如,通过调整`Julia`函数中的`xoom`参数,可以观察到图像在不同放大比例下的自相似性。 **...

    julia,mandelbrot,分形树的matlab程序~

    标题中的“julia, mandelbrot, 分形树的matlab程序”表明这是一个关于使用MATLAB编程实现Julia集合、Mandelbrot集以及分形树的项目。MATLAB是一种广泛使用的数值计算和可视化软件,非常适合进行复杂数学图形的绘制,...

    基于MFC的Mandelbrot集和julia集的画法

    **基于MFC的Mandelbrot集和Julia集的画法** MFC(Microsoft Foundation Classes)是微软提供的一种C++类库,用于构建Windows应用程序,它为开发者提供了丰富的控件和界面元素,使得开发图形用户界面(GUI)变得更加...

    毕业设计MATLAB_函数生成Mandelbrot集和Julia集分形.zip

    通过分析和运行这些MATLAB脚本,我们可以深入理解Mandelbrot集和Julia集的生成原理,并欣赏到数学中的分形之美。这不仅是一个理论上的学习,也是对MATLAB编程和图像处理能力的实际锻炼。在实际应用中,分形理论被...

    MANDELBROT集和JULIA集的分形图之MATLAB实现.doc

    MANDELBROT集和JULIA集的分形图之MATLAB实现.doc

    C# 多线程 多核 分形Mandelbrot集Julia集 预览 及 批量生成 程序 2010.9.14

    话不多说。详情参照我的帖子 ...随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后用户可以生成对应的 较高像素数的图片,还可以选中抗锯齿,连续颜色等选项,增强图像的显示效果 ...

    C# 多线程 多核 分形Mandelbrot集Julia集 预览 及 批量生成 程序

    话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后你们可以生成对应的 较高像素数的图片

    Mandelbrot集和Julia集的图像绘制

    总结来说,Mandelbrot集和Julia集的图像绘制涉及到复数运算、迭代算法、分形理论以及计算机图形学。通过编程,我们可以探索这些集合的美丽和复杂性,同时也深入理解分形几何和复数系统的性质。在VC++环境下,可以...

    分形理论与分形的计算机模拟_例程(MFC).rar

    例如,开发者可能使用了迭代公式,如Julia集或 Mandelbrot集,来生成复杂的分形图案。这些集合通过复数运算和迭代过程产生,每个像素的位置对应着复平面上的一个点,经过多次迭代后,根据是否发散来决定颜色。 ...

    C# 多线程 多核 分形Mandelbrot集Julia集 预览 及 批量生成 程序2010.9.14

    话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件 最新改动 支持 单线程 ,免得使系统响应变得太慢 以致户没法进行其他操作

    混沌与分形-科学的新疆界(英文)

    灵敏度、混合与周期点、有序与混沌、奇异吸引子、典型的分形集如Julia集、Mandelbrot集等,重点介绍了分形与混沌的物理意义、两者之间的关系、与数学的其它方面以及自然现象的联系,展示出分形与混沌的在视觉、图像...

    ising_model.rar_Julia C_Mandelbrot_graph_julia

    给出了二次函数的Julia集分形图的概念及逃逸时间算法绘制复杂分形图的基本原理,对Julia集给出了严格的数学定义.逃逸时间算法即取定迭代次数界限N,经N次迭代后,若x点仍在给定的区域内,则认为x是分形A中的点 否则x不是...

    分形理论在计算机图形学中的应用完整版.doc

    通过深入研究和应用这些理论,我们可以创建出更为生动、细腻的数字图像,为游戏、电影、科学可视化等领域带来新的创新。同时,分形理论也在数据压缩、图像编码、网络路由等方面有着潜在的应用价值。

    分形应用中的数学基础与方法

    在分形理论中,复平面上的迭代函数系统(IFS)常被用来构造和分析分形,如Julia集和Mandelbrot集。 4. **动力系统与分形**:动力系统理论研究系统随时间演变的规律,当这些系统表现出混沌和分形特征时,它们会产生...

Global site tag (gtag.js) - Google Analytics