MandelbrotZoom.java


This is the syntax highlighted version of MandelbrotZoom.java from 3.5 Inheritance of
Introduction to Computer Science by Robert Sedgewick and Kevin Wayne.

/*************************************************************************
 *  Compilation:  javac MandelbrotZoom.java
 *  Execution:    java MandelbrotZoom
 *  Dependencies: InteractiveDraw.java
 *  
 *  Plots the Mandelbrot set and allows the user to zoom in by selecting
 *  a rectangle.
 *
 *************************************************************************/
import java.awt.Color;

public class MandelbrotZoom implements DrawListener {
    private double xmin   = -1.5;   // center x coordinate
    private double ymin   = -1.0;   // center y coordinate
    private double xmax   =  0.5;   // width of plot
    private double ymax   =  1.0;   // height of plot
    private boolean dragging;       // is the user currently dragging the mouse?
    private int ITERS  = 256;
    private int SIZE   = 200;
    private InteractiveDraw d = new InteractiveDraw(SIZE, SIZE);


    public MandelbrotZoom() {
        d.addListener(this);
        d.setScale(xmin, ymin, xmax, ymax);
        draw();
        d.show();
    }

    // return number of Mandelbrot iterations to check z = x + iy
    private static int mand(Complex c, int ITERS) {
        Complex z = c;
        for (int t = 0; t < ITERS; t++) {
            if (z.abs() >= 2.0) return t;
            z = z.times(z).plus(c);
        }  
        return ITERS - 1;
    }


    private void draw() {
        System.out.println("Computing....");
        d.setScale(0, 0, SIZE, SIZE);
        double width  = xmax - xmin;
        double height = ymax - ymin;
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                double a = xmin + i * width / SIZE;
                double b = ymin + j * height / SIZE;
                Complex c = new Complex(a, b);
                int gray = ITERS - 1 - mand(c, ITERS);
                d.setColorRGB(gray, gray, gray);
                d.go(i, j);
                d.spot(0);
            }
        }
        d.show();
        d.setScale(xmin, ymin, xmax, ymax);
        System.out.println("Done.");
    }


    // user clicks the mouse at (x, y)
    public void mousePressed(double x, double y) {
        xmin = xmax = x;
        ymin = ymax = y;
        d.setColor(Color.yellow);
        d.XOROn();
        d.go(x, y);
        dragging = true;
    }

    private void drawRectangle() {
        double x = 0.5 * (xmin + xmax);
        double y = 0.5 * (ymin + ymax);
        double width  = Math.abs(xmax - xmin);
        double height = Math.abs(ymax - ymin);
        d.go(x, y);
        d.spot(width, height);
    }

    // user is dragging the mouse, currently at (x, y)
    public void mouseDragged(double x, double y) {
        if (!dragging) return;
        drawRectangle();
        xmax = x;
        ymax = y;
        drawRectangle();
        d.show();
    }

    // user releases the mouse at location (x, y)
    public void mouseReleased(double x, double y) {
        if (!dragging) return;
        drawRectangle();
        d.XOROff();
        d.setScale(xmin, ymin, xmax, ymax);
        draw();
        d.show();
        dragging = false;
    }


    // save image to file
    public void keyTyped(char c) { d.save("mandel" + c + ".png"); }



    public static void main(String args[]) {
        MandelbrotZoom m = new MandelbrotZoom();
    }

}


Last updated: Sat Aug 7 07:50:01 EDT 2004 .
Copyright © 2004, Robert Sedgewick and Kevin Wayne.