/** A class of Mandelbrot Set objects */ import java.applet.*; import java.awt.*; import java.awt.image.*; import java.lang.*; import java.awt.event.*; public class MandelbrotSet { private Complex ll; // lower left corner of region private double edge; // edge lengthh of region private int res, // resolution: discretize region // into a grid of res X res squares // res & atom must be powers of 2 clr, // # bits or red, green, blue cnt[][]; // iteration count for each "point" public MandelbrotSet(Complex c, double e, int r, int b) { ll = new Complex(c); edge = e; res = r; clr = b; cnt = new int[res][res]; } public void compute() { double gap = edge/res, // space between grid "points" r, i; // the representative point int row, col, lim = (int) Math.pow(2,clr); // iteration limit for (row = 0, i = ll.getImag(); row < res; row++, i += gap) for (col = 0, r = ll.getReal(); col < res; col++, r += gap) cnt[row][col] = getCount(new Complex(r, i), lim); } // compute the count associated with a complex point final private int getCount(Complex c, int lim) { Complex z = new Complex(c); int count = 1; for (; z.sizeSquared() < 4.0 && count < lim; count++) { z.multiply(z); z.add(c); } return count; } public void show(Applet a, Graphics g, int x, int y) { int count, b, colr, lim = (int) Math.pow(2,clr); int[] p = new int[res*res], colors = new int[24]; for (int i = 0; i < 24; i++) colors[i] = 1 << i; for (int row = 0; row < res; row++) for (int col = 0; col < res; col++) { // Encode the count as a pixel p[res*row + col] = 255 << 24; if (cnt[row][col] != lim) { count = cnt[row][col]; for (b = 0; b < 3; b++) for (int c = 0; c < clr; c++) { colr = ((count & 1) == 1) ? colors[8-clr + b*8 + c] : 0; p[res*row + col] = p[res*row + col] | colr; count = count >> 1; } } } // create, display image MemoryImageSource m = new MemoryImageSource(res, res, p, 0, res); Image imag = a.createImage(m); g.drawImage(imag, x, y, null); } }