import java.awt.*;
import java.applet.*;

public class ShapeApplet extends Applet
{
    int ct1,ct2,x,y;
	int PixelsPerSide;
	float BottomLeft[];
	float TopLeft[];
	float SideLength;
	float Scale;
	int iterations;
	int PixCol;
	int topY,bottomY;
	boolean Clickt;
	int leftX,rightX;
	int test;

    Button button;

    public void init()
    {
		BottomLeft=new float[2];
		TopLeft=new float [2];
        BottomLeft[0]=0.26f;
		TopLeft[0]=0.27f;
		BottomLeft[1]=0.0f;
		TopLeft[1]=0.01f;
		PixelsPerSide=320;
		SideLength=TopLeft[0]-BottomLeft[0];
		Scale=SideLength/PixelsPerSide;
		iterations=120;
		Clickt=false;
		button = new Button("Do Over");
        add(button);
    }

    public void paint(Graphics g)
    {
      if (Clickt==false)
	  {
		for (ct1=0; ct1<PixelsPerSide; ++ct1)
		{
			for (ct2=0; ct2<PixelsPerSide; ++ct2)
			{
			  PixCol= (PrintPixel(ct1*Scale +BottomLeft[0],ct2*Scale+BottomLeft[1]));				
			  switch (PixCol)
				  {
					  case 0:
						  g.setColor(Color.black);
						  break;
					  case 1:
						  g.setColor(Color.blue);
						  break;
					  case 2:
						  g.setColor(Color.cyan);
						  break;
					  case 3:
						  g.setColor(Color.darkGray);
						  break;
					  case 4:
						  g.setColor(Color.gray);
						  break;
					  case 5:
						  g.setColor(Color.green);
						  break;
					  case 6:
						  g.setColor(Color.lightGray);
						  break;
					  case 7:
						  g.setColor(Color.magenta);
						  break;
					  case 8:
						  g.setColor(Color.orange);
						  break;
					  case 9:
						  g.setColor(Color.pink);
						  break;
					  case 10:
						  g.setColor(Color.red);
						  break;
					  case 11:
						  g.setColor(Color.white);
						  break;
					  default:
						  g.setColor(Color.yellow);
				  }	  
					  
				 g.drawLine(ct1,ct2,ct1,ct2);
			}
		}
		}
	    else
		{
        g.setColor(Color.white);
		g.drawRect(leftX,topY,160,160);
		
		BottomLeft[0]=((leftX*SideLength)/320)+BottomLeft[0];
		TopLeft[0]=((rightX*SideLength)/320)+BottomLeft[0];
		BottomLeft[1]=((topY*SideLength)/320)+BottomLeft[1];
		TopLeft[1]=((bottomY*SideLength)/320)+BottomLeft[1];
		SideLength=TopLeft[0]-BottomLeft[0];
		Scale=SideLength/PixelsPerSide;
		iterations=120;
		Clickt=false;
		repaint();
		
		}
    }

    public boolean action(Event event, Object arg)
    {
        BottomLeft[0]=0.26f;
		TopLeft[0]=0.27f;
		BottomLeft[1]=0.0f;
		TopLeft[1]=0.01f;
		PixelsPerSide=320;
		SideLength=TopLeft[0]-BottomLeft[0];
		Scale=SideLength/PixelsPerSide;
		iterations=120;
        repaint();
        return true;
    }

    int PrintPixel(float c1, float c2)
	{
		float z[],c[],resultSq[],resultAd[];
		float tempSq;
		float tempAd;
		int count;
		boolean TestValue;

		z=new float[2];
		c=new float[2];
		resultSq=new float[2];
		resultAd=new float[2];

		c[0]=c1;
		c[1]=c2;
		z[0]=c[0];
		z[1]=c[1];
		count=0;

		do
		{
			++count;
            
			tempSq=z[0]*z[0]-z[1]*z[1];
			resultSq[1]=2*z[0]*z[1];
			resultSq[0]=tempSq;
			z[0]=resultSq[0];
			z[1]=resultSq[1];

            tempAd=c[0]+z[0];
			resultAd[1]=c[1]+z[1];
			resultAd[0]=tempAd;
			z[0]=resultAd[0];
			z[1]=resultAd[1];

			TestValue=((z[0]*z[0]+z[1]*z[1])<4);
		}	
		while ((count != iterations) && (TestValue));
		PixCol=(count / 10) % 12;
		return PixCol;
	}

	public boolean mouseDown(Event evt, int x, int y)
	{
	 
	 topY=y-80;
	 bottomY=y+79;
	 leftX=x-80;
	 rightX=x+79;
	 if (topY<1)
	 {
		topY=0;
		bottomY=160;
	 }
	 if (bottomY>320)
	 {
		 bottomY=319;
		 topY=160;
	 }
	if (leftX<1)
	 {
		leftX=0;
		rightX=160;
	 }
	 if (rightX>320)
	 {
		 rightX=319;
		 leftX=160;
	 }

	 Clickt=true;
	 repaint();
	 return true;
	}

}
