//Modificacion del applet Julia para Z^4-1
//CARLOS PIARPUEZAN
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.yellow);
                    g.fillRect(i,j,1,1);
		}
							
		if( d2 <= 0.25 ) 
		{ 
                    g.setColor(Color.blue);
                    g.fillRect(i,j,1,1);
		}
							
		if( d3 <= 0.25 ) 
		{ 
                    g.setColor(Color.magenta);
                    g.fillRect(i,j,1,1);
		}
                
                if( d4 <= 0.25)
                {
                    g.setColor(Color.red);
                    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 < 40; 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,i; 
		
		
		w = z.multiply(z);
                i = w.multiply(z);
		z = i.multiply(z);
		z = z.add(k);
	

		return z;
	}

	public static Complex fd(Complex z)
	{
	
		Complex k = new Complex(3,0);
                Complex i = z.multiply(z);
				
		z = i.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) {}
		
}



