//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 infoPanel; private MandelbrotPanel drawPanel; double scale; double originalZoom; double firstRealPress; //set by mousePressed double firstImagPress; public void init() { Container container = getContentPane(); container.setLayout( new BorderLayout(2,2) ); infoPanel = new JPanel(); infoPanel.setLayout( new GridLayout(3,6)); startRealLabel = new JLabel( " Start real" ); // startRealLabel.setHorizontalTextPosition( SwingConstants.RIGHT ); startRealField = new JTextField( 6 ); startRealField.setText("-2.0"); startRealField.setToolTipText( "Min x axis"); infoPanel.add( startRealLabel ); infoPanel.add( startRealField ); endRealLabel = new JLabel( " End real" ); endRealField = new JTextField( 6 ); endRealField.setText("1.0"); endRealField.setToolTipText( "Max x axis"); infoPanel.add( endRealLabel ); infoPanel.add( endRealField ); startImagLabel = new JLabel( " Start imaginary" ); startImagField = new JTextField( 6 ); startImagField.setText("-1.0"); startImagField.setToolTipText( "Min y axis"); infoPanel.add( startImagLabel ); infoPanel.add( startImagField ); endImagLabel = new JLabel( " End imaginary" ); endImagField = new JTextField( 6 ); endImagField.setText("1.0"); endImagField.setToolTipText( "Max y axis"); infoPanel.add( endImagLabel ); infoPanel.add( endImagField ); stepsLabel = new JLabel( " Increments" ); stepsField = new JTextField( 6 ); stepsField.setText("1000"); stepsField.setToolTipText( "x and y steps" ); infoPanel.add( stepsLabel ); infoPanel.add( stepsField ); maxItsLabel = new JLabel( " Max iterations" ); maxItsField = new JTextField( 6 ); maxItsField.setText("100"); maxItsField.setToolTipText( "loop inside the snowman" ); infoPanel.add( maxItsLabel ); infoPanel.add( maxItsField ); zoomLabel = new JLabel( " Zoom factor" ); zoomField = new JTextField( 6 ); zoomField.setEditable( false ); zoomField.setText("1"); infoPanel.add( zoomLabel ); infoPanel.add( zoomField ); originalZoom = Double.parseDouble(endRealField.getText()) - Double.parseDouble(startRealField.getText()); doitButton = new JButton( "Do it" ); doitButton.setToolTipText( "Display the set based on current parameters" ); infoPanel.add( doitButton ); doitButton.addActionListener( this ); JLabel dummyLabel = new JLabel( "" ); infoPanel.add( dummyLabel ); infoPanel.add( dummyLabel ); infoPanel.add( dummyLabel ); container.add( infoPanel, BorderLayout.SOUTH); drawPanel = new MandelbrotPanel(); container.add( drawPanel, BorderLayout.CENTER); 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 ); double start_real = Double.parseDouble(startRealField.getText()); double end_real = Double.parseDouble(endRealField.getText()); double start_imag = Double.parseDouble(startImagField.getText()); double end_imag = Double.parseDouble(endImagField.getText()); if (r>=start_real && r<=end_real && imag>=start_imag && imag<=end_imag) showStatus("(" + r + "," + imag + ")"); else showStatus( "Change the parameters or drag mouse for close-up" ); } public void mouseDragged( MouseEvent event) { int x = event.getX(); int y = event.getY(); double r = getR( x ); double imag = getImag( y ); showStatus("(" + 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 ); //dead bug: setText of textfields changed the coordinates firstRealPress = r; firstImagPress = imag; } public void mouseReleased (MouseEvent event) { int x = event.getX(); int y = event.getY(); double r = getR( x ); double imag = getImag( y ); if (r > firstRealPress) { startRealField.setText ("" + firstRealPress); endRealField.setText ("" + r); } else { startRealField.setText ("" + r); endRealField.setText ("" + firstRealPress); } if (imag > firstImagPress) { startImagField.setText ("" + firstImagPress); endImagField.setText ("" + imag); } else { startImagField.setText ("" + imag); endImagField.setText ("" + firstImagPress); } drawMandelbrot(); } } ); } public void start(){ drawMandelbrot(); } public void actionPerformed( ActionEvent event ) { if ( event.getSource() == doitButton ) { drawMandelbrot(); } } 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()); double end_imag = Double.parseDouble(endImagField.getText()); return -y / scale + end_imag; //y axis is flipped } public void drawMandelbrot() { showStatus( "Calculating..." );//only the last showStatus is effective? drawPanel.draw( Double.parseDouble(startRealField.getText()), Double.parseDouble(endRealField.getText()), Double.parseDouble(startImagField.getText()), Double.parseDouble(endImagField.getText()), Integer.parseInt(stepsField.getText()), Integer.parseInt(maxItsField.getText())); // showStatus( "Change the parameters or drag mouse for close-up" ); double start_real, end_real, start_imag, end_imag; start_real = Double.parseDouble(startRealField.getText()); end_real = Double.parseDouble(endRealField.getText()); start_imag = Double.parseDouble(startImagField.getText()); end_imag = Double.parseDouble(endImagField.getText()); double dist_real = Math.abs(end_real - start_real); double dist_imag = Math.abs(end_imag - start_imag); zoomField.setText("" + originalZoom/dist_real); double xScale = drawPanel.getWidth() / dist_real; double yScale = drawPanel.getHeight() / dist_imag; scale = Math.min(yScale,xScale); } } class MandelbrotPanel extends JPanel { private double start_real, end_real, start_imag, end_imag, scale; private int max_its, steps; public void draw(double sReal, double eReal, double sImag, double eImag, int stps, int its) { start_real = sReal; end_real = eReal; start_imag = sImag; end_imag = eImag; steps = stps; max_its = its; repaint(); } public void paintComponent ( Graphics g ) { super.paintComponent( g ); int its; int x1, y1; double inc_real, inc_imag; double zr, zi, t; double dist_real = Math.abs(end_real - start_real); double dist_imag = Math.abs(end_imag - start_imag); inc_real = dist_real / steps; inc_imag = dist_imag / steps; // double mid_real = start_real + dist_real/2; //double mid_imag = start_imag + dist_imag/2; // zoomField.setText("" + originalZoom/dist_real); double xScale = getWidth() / dist_real; double yScale = getHeight() / dist_imag; scale = Math.min(yScale,xScale); for (double r=start_real; r