//Mandelbrot.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Mandelbrot extends JApplet implements ActionListener { private JLabel startRealLabel; private JTextField startRealField; private JLabel endRealLabel; private JTextField endRealField; private JLabel startImagLabel; private JTextField startImagField; private JLabel endImagLabel; private JTextField endImagField; private JLabel stepsLabel; private JTextField stepsField; private JLabel maxItsLabel; private JTextField maxItsField; private JButton doitButton; private JLabel zoomLabel; private JTextField zoomField; private JPanel topPanel; int xcenter, ycenter; //needed by mouse event methods double scale; double originalZoom; public void init() { Container container = getContentPane(); // container.setLayout( new BorderLayout() ); topPanel = new JPanel(); topPanel.setLayout( new GridLayout(3,6)); startRealLabel = new JLabel( "Start real" ); startRealField = new JTextField( 6 ); startRealField.setText("-2.0"); topPanel.add( startRealLabel ); topPanel.add( startRealField ); endRealLabel = new JLabel( "End real" ); endRealField = new JTextField( 6 ); endRealField.setText("1.0"); topPanel.add( endRealLabel ); topPanel.add( endRealField ); startImagLabel = new JLabel( "Start imaginary" ); startImagField = new JTextField( 6 ); startImagField.setText("-1.0"); topPanel.add( startImagLabel ); topPanel.add( startImagField ); endImagLabel = new JLabel( "End imaginary" ); endImagField = new JTextField( 6 ); endImagField.setText("1.0"); topPanel.add( endImagLabel ); topPanel.add( endImagField ); stepsLabel = new JLabel( "Increments" ); stepsField = new JTextField( 6 ); stepsField.setText("1000"); topPanel.add( stepsLabel ); topPanel.add( stepsField ); maxItsLabel = new JLabel( "Max iterations" ); maxItsField = new JTextField( 6 ); maxItsField.setText("100"); topPanel.add( maxItsLabel ); topPanel.add( maxItsField ); doitButton = new JButton( "Do it" ); topPanel.add( doitButton ); doitButton.addActionListener( this ); zoomLabel = new JLabel( "Zoom factor" ); zoomField = new JTextField( 6 ); zoomField.setEditable( false ); zoomField.setText("1"); topPanel.add( zoomLabel ); topPanel.add( zoomField ); originalZoom = Double.parseDouble(endRealField.getText()) - Double.parseDouble(startRealField.getText()); container.add( topPanel, BorderLayout.SOUTH); addMouseMotionListener( //anonymous inner class overrides mouseMoved new MouseMotionAdapter() { public void mouseMoved( MouseEvent event) { int x = event.getX(); int y = event.getY(); double r = getR( x ); double imag = getImag( y ); showStatus("move "+x + ", " + y + " --> " + r + ", " + imag); } public void mouseDragged( MouseEvent event) { int x = event.getX(); int y = event.getY(); double r = getR( x ); double imag = getImag( y ); showStatus("drag " + x + ", " + y + " --> " + r + ", " + imag); } } ); addMouseListener ( new MouseAdapter() { public void mousePressed (MouseEvent event) { int x = event.getX(); int y = event.getY(); double r = getR( x ); double imag = getImag( y ); startRealField.setText ("" + r); startImagField.setText ("" + imag); } public void mouseReleased (MouseEvent event) { int x = event.getX(); int y = event.getY(); double r = getR( x ); double imag = getImag( y ); endRealField.setText ("" + r); endImagField.setText ("" + imag); repaint(); } } ); } public void actionPerformed( ActionEvent event ) { if ( event.getSource() == doitButton ) repaint(); } private double getR (int x ) { double start_real = Double.parseDouble(startRealField.getText()); return x / scale + start_real; } private double getImag (int y ) { double start_imag = Double.parseDouble(startImagField.getText()); return y / scale + start_imag; } public void paint( Graphics g ) { super.paint( g ); int its, max_its, steps; int x1, y1; int appletSize; double start_real, end_real, inc_real, start_imag, end_imag, inc_imag; double zr, zi, t; start_real = Double.parseDouble(startRealField.getText()); end_real = Double.parseDouble(endRealField.getText()); start_imag = Double.parseDouble(startImagField.getText()); end_imag = Double.parseDouble(endImagField.getText()); steps = Integer.parseInt(stepsField.getText()); max_its = Integer.parseInt(maxItsField.getText()); inc_real = (end_real - start_real) / steps; inc_imag = (end_imag - start_imag) / steps; double dist_real = Math.abs(end_real - start_real); double dist_imag = Math.abs(end_imag - start_imag); double mid_real = start_real + dist_real/2; double mid_imag = start_imag + dist_imag/2; zoomField.setText("" + originalZoom/dist_real); appletSize = Math.min(getWidth(),getHeight()); //double xScale = appletSize / dist_real; double xScale = getWidth() / dist_real; //double yScale = appletSize / dist_imag; double yScale = getHeight() / dist_imag; scale = Math.min(yScale,xScale); //xcenter = appletSize / 2; //ycenter = appletSize / 2 + 40; for (double r=start_real; r