/**
 * @version 1.0 21 sept 00
 * @version 1.10 1999-09-12
 * @author Cay Horstmann
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

public class MandelbrotTest {
   public static void main(String[] args) {
      JFrame f = new JFrame("MandelbrotTest");
      f.setSize(400, 400);
      f.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) { System.exit(0); }
         } );
			f.setContentPane(new MandelbrotPanel());
      f.setVisible(true);
   }
}


class MandelbrotPanel extends JPanel
{  public void paintComponent(Graphics g)
   {  super.paintComponent(g);
	    setBackground(Color.green);
      BufferedImage image = new BufferedImage(getWidth(),
         getHeight(), BufferedImage.TYPE_INT_ARGB);
      generer(image);
      g.drawImage(image, 0, 0, null);
   }

   public void generer(BufferedImage image)
   {  int width = image.getWidth();
      int height = image.getHeight();
      WritableRaster raster = image.getRaster();
      ColorModel model = image.getColorModel();

      Color fractalColor = Color.red;
      int argb = fractalColor.getRGB();
      Object colorData = model.getDataElements(argb, null);

      for (int i = 0; i < width; i++)
				 for (int j = 0; j < height; j++) {
            double a = XMIN + i * (XMAX - XMIN) / width;
            double b = YMIN + j * (YMAX - YMIN) / height;
            if (converge(a, b))
               raster.setDataElements(i, j, colorData);
         }
   }

	 private boolean converge(double a, double b) {
      double xnew, x = 0.0;
      double ynew, y = 0.0;
      int iterations = 0;
			for (int iters = 0; iters < MAX_ITERATIONS; iters++) {
				 xnew = x * x - y * y + a;
				 ynew = 2 * x * y + b;
         x = xnew;
         y = ynew;
				 if (x > 2 || y > 2) return false;
      }
      return true;
   }

   private static final double XMIN = -2;
   private static final double XMAX = 2;
   private static final double YMIN = -2;
   private static final double YMAX = 2;
   private static final int MAX_ITERATIONS = 16;
}
