//
// The Mandelbrot Fractal Set 
// Copyright c Brian P. Vogl
// September 19 - 21, 2000
//
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class mandel extends Applet implements ActionListener
{ 	 int rgb[] = { 
	 0x000000, 0xA1A1A1, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF10, 0x52b552, 0x31b5d6,
	 0xffce9c, 0xbdc6de, 0xce007b, 0x527b10, 0xffb573, 0xbdc6de, 0xf7bdde, 0xffffff };


	int xs=-1,ys=-1,xn=-1,yn=-1;  // Mouse position variables

	int maxcol = 640;
	int maxrow = 350;
	int maxcolor = rgb.length;
	int maxiter = 512;
	int maxsize = 4;
	double Q[] = new double[350];
	double Xmax, Xmin, Ymax, Ymin;
	double P, delP, delQ, X, Y, Xsq, Ysq;
	int i, color, row, col;

	public void init()
	{	
		addMouseListener(new MPListener());
		addMouseMotionListener(new MMListener());
		Xmax = 0.5d;
		Xmin = -2.0d;
		Ymax = 1.15d;
		Ymin = -1.15d;
		delP = (Xmax - Xmin)/maxcol;
		delQ = (Ymax - Ymin)/maxrow;
		Q[0] = Ymin;
		for(row = 1; row < maxrow; row++)
			Q[row] = Q[row-1] + delQ;
	}

	public void paint(Graphics gr)	// Draw the set
	{	P = Xmin;
		for(col = 0; colxn) { x1=xn; w1=xs-xn; }
					else { x1=xs; w1=xn-xs; } 
					if(ys>yn) { y1=yn; h1=ys-yn; }
					else { y1=ys; h1=yn-ys; }
					gr.drawRect(x1, y1, w1, h1);
				}
				xn = e.getX();
				yn = e.getY();
				if(xs>xn) { x1=xn; w1=xs-xn; }
				else { x1=xs; w1=xn-xs; } 
				if(ys>yn) { y1=yn; h1=ys-yn; }
				else { y1=ys; h1=yn-ys; }
				gr.drawRect(x1, y1, w1, h1);
			}
		}
	}

	class MPListener extends MouseAdapter
	{	public void mousePressed(MouseEvent e)
		{	double maxtmp, mintmp;
			int tmp, xe=-1, ye=-1;
			if(xs == -1) xs=e.getX();
			else xe=e.getX();
			if(ys == -1) ys=e.getY();
			else ye=e.getY();
			if(xe == -1) return;

			if(xs>xe) { tmp = xs; xs = xe; xe = tmp; }
			if(ys>ye) { tmp = ys; ys = ye; ye = tmp; }

			mintmp = ((Xmax - Xmin) * xs )/ maxcol + Xmin;
			maxtmp = ((Xmax - Xmin) * xe )/ maxcol + Xmin;
			Xmin = mintmp;
			Xmax = maxtmp;
			mintmp = ((Ymax - Ymin) * ys )/ maxrow + Ymin;
			maxtmp = ((Ymax - Ymin) * ye )/ maxrow + Ymin;
			Ymin = mintmp;
			Ymax = maxtmp;

			delP = (Xmax - Xmin)/maxcol;
			delQ = (Ymax - Ymin)/maxrow;
			Q[0] = Ymin;
			for(row = 1; row < maxrow; row++)
				Q[row] = Q[row-1] + delQ;
			xs=-1; ys=-1; xn=-1; yn=-1;
			repaint();		
		}
	}

	public void mouseReleased(MouseEvent e){}
	public void actionPerformed(ActionEvent Event){}
}