newton.java

来自「分形算法的Java程序」· Java 代码 · 共 177 行

JAVA
177
字号
//Newton迭代法(fractal.cn)2004
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.Serializable;

public class Newton extends Applet implements Serializable
{
    private Image offScreenImage=null;
    private Graphics offScreenBuffer=null;
	
    private int width=401;
    private int height=401;
	
    int n;
    int c;
    //下列数组用来存储通过牛顿方法迭代所产生的点
    int Fnewton[][]=new int[400][400];
	
    public Newton(){}
	
    public void init()
    {
		offScreenImage=this.createImage(width,height);
		offScreenBuffer=offScreenImage.getGraphics();
	}

	public void update(Graphics g){
		paint(g);
	}
	
	public void paint(Graphics g)
        {
			offScreenBuffer.setColor(Color.white);
			offScreenBuffer.fillRect(0,0,width,height);
         //绘制基于牛顿方法的分形  
			if (Fnewton[0][0] != 0){
	    for (int x=0; x<400; x++){
		for (int y=0; y<400; y++)
		    {
			if (Fnewton[x][y]<=5)
			    g.setColor(new Color(Fnewton[x][y]*50, 0 , 0));
			else if (Fnewton[x][y]<=10)
			    g.setColor(new Color(0,0,Fnewton[x][y]*20 ));
			else
			    g.setColor(new Color(0,Fnewton[x][y]*9,0));
			g.drawLine(x,y,x,y);
		    }
	   }
	      		}
			drawFract(offScreenBuffer,n,c);
			g.drawImage(offScreenImage,0,0,this);
	}
	

   public void drawFract(Graphics g, int n, int c)
   {
    	n=3;
	c=3;
	Complex root = new Complex();
	Complex hold = new Complex();
	Complex foo = new Complex(c,0);
	int tp = 0;
	
	for (double x=-2; x<=2; x+=.01)
	    {
		for (double y=-2; y<=2; y+=.01)
		    {
		        root.compEq(new Complex(x,y));
		        double dx = 1;
			tp=0;
			
			while ((dx>.1) && (tp < 25))
			    {
				
				hold = compDiv(compSubtr(root.compPwr(n),foo),doubleMult(n,root.compPwr(n-1)));
				dx=hold.compNorm();
				//设置根为新根 (root - f(x)/f'(x))
				root.compEq(compSubtr(root , compDiv(compSubtr(root.compPwr(n),foo),doubleMult(n,root.compPwr(n-1)))));
				tp++;
				
 
			    }
			
			
			Fnewton[(int)(x*100 + 200)][(int)(y*100 + 200)]=tp;
		    }
		
	   }
    }

    //复数运算类,有加、减、乘、除、指数等
    public class Complex
    {
	

	double real,imag;

	public Complex()
	{
	    real=0;
	    imag=0;
	}
	
	public Complex(double i, double j)
	{
	    real = i;
	    imag =j;
	}
	
	public double retReal()
	{
	    return real;
	}

	public double retImag()
	{
	    return imag;
	}

	public void compEq(Complex i)
	{
	    real = i.retReal();
	    imag = i.retImag();
	}
	
	public void compPrint()
	{
	    System.out.println(real);
	    System.out.println(imag);
	}
	public Complex compPwr(int i)
	{
	    
	    Complex foo = new Complex(real,imag);
	    Complex bar = new Complex(real,imag);
	    for (int j=0; j<(i-1); j++) 
		foo.compEq(compMult(foo, bar));
	    return foo;
	}

	public double compNorm()
	{
	    return Math.sqrt(real*real+imag*imag);
	}
    }
    public Complex compAdd(Complex i, Complex j)
    {
	return new Complex(i.retReal()+j.retReal(), i.retImag()+j.retImag());
    }
    
    public Complex compSubtr(Complex i, Complex j)
    {
	return new Complex(i.retReal()-j.retReal(), i.retImag()-j.retImag());
    }
    
    public Complex doubleMult(double i, Complex j)
    {
	return new Complex(i*j.retReal(),i*j.retImag());
    }
    
    public Complex compMult(Complex i, Complex j)
    {
	return new Complex(i.retReal()*j.retReal()-i.retImag()*j.retImag(),i.retReal()*j.retImag()+j.retReal()*i.retImag());
    }
    
    public Complex compDiv(Complex i, Complex j)
    {
	return new Complex((i.retReal()*j.retReal()+i.retImag()*j.retImag())/(j.retReal()*j.retReal()+j.retImag()*j.retImag()),(i.retImag()*j.retReal() - i.retReal()*j.retImag())/(j.retReal()*j.retReal()+j.retImag()*j.retImag()));
    }
    
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?