import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Julia extends Applet implements MouseListener {

	private double scale = 1.0;
	public void init()
	{
		addMouseListener(this);
		resize(300,300);                
	}

	public void paint(Graphics g)
	{
		int i=0,j=0;
		
		double a = 0.0;
		double b = 0.0;
		double d1 = 0.0;
		double d2 = 0.0;
		double d3 = 0.0;

		Complex z = new Complex (0,0);
		Complex r1 = new Complex(-1.0,0.0);
		Complex r2 = new Complex(1.0,0.0);
		Complex r3 = new Complex(0.0,-1.0);
        Complex r4 = new Complex(0.0,1.0);
		
		for(i=0; i<300; i++)
		{
					for(j=0; j<300; j++)
					{
							a = (i-150.0)/(150.0*scale);
							b = (j-150.0d)/(150.0*scale);

							z.set(a,b);
							z = Newton(z);
							
							d1 = Math.sqrt(r1.add(z).normsqr());
							d2 = Math.sqrt(r2.add(z).normsqr());
							d3 = Math.sqrt(r3.add(z).normsqr());
							
							g.setColor(Color.orange);
    					g.fillRect(i,j,1,1);
							
							if( d1 <= 0.25) 
							{ 
									g.setColor(Color.red);
    					    g.fillRect(i,j,1,1);
							}
							
							if( d2 <= .25 ) 
							{ 
									g.setColor(Color.magenta);
    					    g.fillRect(i,j,1,1);
							}
							
							if( d3 <= .25 ) 
							{ 
									g.setColor(Color.blue);
    					    g.fillRect(i,j,1,1);
							}
							if( d3 <= .25 ) 
							{ 
									g.setColor(Color.green);
    					    g.fillRect(i,j,1,1);
							}
					}
			
		}
	
	}
	
	public static Complex Newton(Complex z)
	{
		int i = 0;
		Complex k = new Complex(-1,0);
		Complex w;
		
		for(i=0 ; i < 20; i++)
		{
		
             w = f(z);
			 w = w.divide(fd(z));
			 w = w.multiply(k);
			 z = z.add(w);
			 
		}
		
		return z;
	}
	
	public static Complex f(Complex z)
	{
	 
	    Complex k = new Complex(-1,0);
		Complex w=z;
		 	
		z = w.multiply(z); 
		z = w.multiply(z); 
		z = w.multiply(z); 
		z = z.add(k);      
                return z;
	}

	public static Complex fd(Complex z)
	{
	
		Complex k = new Complex(3,0);
		Complex w;			
		w = z.multiply(z);                  
		z = w.multiply(z);   
		z = z.multiply(k);   			
		return z;
	}
	
	public void mousePressed(MouseEvent event) {        
        scale/=2;
        repaint();
   }
   public void mouseClicked(MouseEvent event) {}
   public void mouseReleased(MouseEvent event) {}
   public void mouseEntered(MouseEvent event) {}
   public void mouseExited(MouseEvent event) {}
		
}


