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;
		double d4 = 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());
							d4 = Math.sqrt(r4.add(z).normsqr());

							g.setColor(Color.black);
    					g.fillRect(i,j,1,1);
							
							if( d1 <= 0.25) 
							{ 
									g.setColor(Color.blue);
    					    g.fillRect(i,j,1,1);
							}
							
							if( d2 <= 0.25 ) 
							{ 
									g.setColor(Color.yellow);
    					    g.fillRect(i,j,1,1);
							}
							
							if( d3 <= 0.25 ) 
							{ 
									g.setColor(Color.red);
    					    g.fillRect(i,j,1,1);
							}

							if( d4 <= 0.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,x; 
		
		
		w = z.multiply(z);
		x = w.multiply(z);
		z = z.multiply(x);
		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) {}
		
}


