diff options
3 files changed, 199 insertions, 23 deletions
| diff --git a/Week11 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotController.java b/Week11 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotController.java index 930d589..f072805 100644 --- a/Week11 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotController.java +++ b/Week11 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotController.java @@ -20,28 +20,39 @@ public class MandelbrotController {          this.grid = grid;      } -    public void redraw() { +    public double getX(int x_on_screen) {          double centerX = mandelbrotProvider.getCenterX(); +        double scale = mandelbrotProvider.getScale(); +        int grid_w = grid.getWidth(); +        double  min_x = centerX - grid_w / scale / 2, +                max_x = centerX + grid_w / scale / 2; +         +        return min_x + (((float) x_on_screen) / grid_w) * (max_x - min_x); +    } +     +    public double getY(int y_on_screen) {          double centerY = mandelbrotProvider.getCenterY();          double scale = mandelbrotProvider.getScale(); +        int grid_h = grid.getHeight(); +        double  min_y = centerY - grid_h / scale / 2, +                max_y = centerY + grid_h / scale / 2; +         +        return min_y + (((float) y_on_screen) / grid_h) * (max_y - min_y); +    } +     +    public void redraw() {          int repetitions = mandelbrotProvider.getRepetitions();          int grid_w = grid.getWidth(), grid_h = grid.getHeight(); -        double min_x = centerX - grid_w / scale / 2, -                max_x = centerX + grid_w / scale / 2, -                min_y = centerY - grid_h / scale / 2, -                max_y = centerX + grid_h / scale / 2; -         -        for (float i = 0; i < grid_w; i++) { -            for (float j = 0; j < grid_h; j++) { -                int grayscale = Mandelbrot.mandelNumber( -                        min_x + (i / grid_w) * (max_x - min_x),  -                        min_y + (j / grid_h) * (max_y - min_y), -                        repetitions -                ) * 255 / repetitions; -                int[] color = {grayscale, grayscale, grayscale}; -                grid.setPixel((int) i, (int) j, color); +        for (int i = 0; i < grid_w; i++) { +            for (int j = 0; j < grid_h; j++) { +                double mandel = ((double) Mandelbrot.mandelNumber(getX(i), getY(j), repetitions) * Math.PI) / repetitions; +                int[] color = { +                    (int) (255 * Math.sin(mandel)),  +                    (int) (255 * Math.sin(mandel + Math.PI / 3)),  +                    (int) (255 * Math.sin(mandel + 2 * Math.PI / 3))}; +                grid.setPixel(i, j, color);              }                         }      } diff --git a/Week11 Mandelbrot/src/com/camilstaps/mandelbrot/ZoomFrame.java b/Week11 Mandelbrot/src/com/camilstaps/mandelbrot/ZoomFrame.java new file mode 100644 index 0000000..1a48926 --- /dev/null +++ b/Week11 Mandelbrot/src/com/camilstaps/mandelbrot/ZoomFrame.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2015 Camil Staps + */ +package com.camilstaps.mandelbrot; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import javax.swing.JFrame; + +/** + * + * @author camilstaps + */ +public class ZoomFrame extends JFrame implements MouseListener, MouseMotionListener { +     +    private MandelbrotController mandelbrotController; +    private MandelbrotTextFields mandelbrotTextFields; +     +    private Graphics graphics; +     +    private int start_x, start_y, old_x, old_y; +     +    public ZoomFrame(String s) { +        super(s); +        addMouseListener(this); +        addMouseMotionListener(this); +    } +     +    public void setMandelbrotController(MandelbrotController mc) { +        mandelbrotController = mc; +    } +     +    public void setMandelbrotTextFields(MandelbrotTextFields mtf) { +        mandelbrotTextFields = mtf; +    } + +    @Override +    public void mouseClicked(MouseEvent me) { +    } + +    @Override +    public void mousePressed(MouseEvent me) { +        old_x = start_x = me.getX(); +        old_y = start_y = me.getY(); +    } + +    @Override +    public void mouseReleased(MouseEvent me) { +        if (me.getX() == start_x && me.getY() == start_y) { +            if (mandelbrotController == null || mandelbrotTextFields == null) +                return; + +            mandelbrotTextFields.setCenterX(mandelbrotController.getX(me.getX())); +            mandelbrotTextFields.setCenterY(mandelbrotController.getY(me.getY())); +             +            if ((me.getModifiers() & InputEvent.SHIFT_MASK) != 0) { +                mandelbrotTextFields.setScale(mandelbrotTextFields.getScale() / 2); +            } else { +                mandelbrotTextFields.setScale(mandelbrotTextFields.getScale() * 2); +            } +        } else { +            double center_x = (mandelbrotController.getX(me.getX()) +                    - mandelbrotController.getX(start_x)) / 2 +                    + mandelbrotController.getX(start_x); +            double center_y = (mandelbrotController.getY(me.getY()) +                    - mandelbrotController.getY(start_y)) / 2 +                    + mandelbrotController.getY(start_y); +             +            mandelbrotTextFields.setCenterX(center_x); +            mandelbrotTextFields.setCenterY(center_y); +             +            double scale = mandelbrotTextFields.getScale() +                    / (me.getX() - start_x) +                    * getWidth(); +             +            System.err.println(mandelbrotTextFields.getScale()); +            System.err.println(me.getX() - start_x); +            System.err.println(getWidth()); +             +            mandelbrotTextFields.setScale(scale); +        } +             +        mandelbrotController.redraw(); +    } + +    @Override +    public void mouseEntered(MouseEvent me) { +    } + +    @Override +    public void mouseExited(MouseEvent me) { +    } + +    @Override +    public void mouseDragged(MouseEvent me) { +        Graphics g = getSafeGraphics(); +        if (g != null) { +            eraseZoombox(); +            g.drawRect(start_x, start_y, me.getX() - start_x, me.getX() - start_x); +            old_y = old_x = me.getX(); +        } +    } +     +    private Graphics getSafeGraphics() { +        if (graphics == null) { +            graphics = getGraphics(); +            graphics.setXORMode(Color.white); +        } +        return graphics; +    } +     +    private void eraseZoombox() { +        Graphics g = getSafeGraphics(); +        if (g != null) +            g.drawRect(start_x, start_y, old_x - start_x, old_y - start_x); +    } + +    @Override +    public void mouseMoved(MouseEvent me) { +        //System.err.println(me.toString()); +    } +     +    public interface MandelbrotTextFields { +        public void setCenterX(double x); +        public void setCenterY(double y); +        public double getScale(); +        public void setScale(double scale); +        public void setRepetitions(double repetitions); +    } +     +} diff --git a/Week11 Mandelbrot/src/fractals/MainWindow.java b/Week11 Mandelbrot/src/fractals/MainWindow.java index 44e1791..7a7a94f 100644 --- a/Week11 Mandelbrot/src/fractals/MainWindow.java +++ b/Week11 Mandelbrot/src/fractals/MainWindow.java @@ -3,6 +3,7 @@ package fractals;  import com.camilstaps.mandelbrot.MandelbrotController;
 +import com.camilstaps.mandelbrot.ZoomFrame;
  import java.awt.BorderLayout;
  import java.awt.FlowLayout;
  import java.awt.Insets;
 @@ -11,6 +12,7 @@ import java.awt.event.ActionListener;  import javax.swing.JButton;
  import javax.swing.JFrame;
 +import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.JTextField;
 @@ -24,23 +26,23 @@ import javax.swing.JTextField;   * creates a window to which a GridView panel is added
   * 
   */
 -public class MainWindow implements MandelbrotController.MandelbrotProvider {
 +public class MainWindow implements MandelbrotController.MandelbrotProvider, ZoomFrame.MandelbrotTextFields {
      // the size of the window
 -    public static final int WIDTH = 500, HEIGHT = 500;
 +    public static final int WIDTH = 650, HEIGHT = 650;
      // The grip panel
      private final GridView grid;
 -    private final JTextField field_centerX = new JTextField("0");
 -    private final JTextField field_centerY = new JTextField("0");
 -    private final JTextField field_scale = new JTextField("100");
 -    private final JTextField field_repetitions = new JTextField("100");
 +    private final JTextField field_centerX = new JTextField("0", 6);
 +    private final JTextField field_centerY = new JTextField("0", 6);
 +    private final JTextField field_scale = new JTextField("100", 6);
 +    private final JTextField field_repetitions = new JTextField("100", 6);
      private final JButton button_redraw = new JButton("Redraw");
      private final MandelbrotController mandelbrotController;
      public MainWindow () {
 -    	JFrame mainFrame = new JFrame ("Mandelbrot");
 +        ZoomFrame mainFrame = new ZoomFrame ("Mandelbrot");
          mainFrame.setLayout(new BorderLayout());
      	mainFrame.setSize (WIDTH, HEIGHT);
 @@ -53,7 +55,11 @@ public class MainWindow implements MandelbrotController.MandelbrotProvider {          grid = new GridView(WIDTH - insets.left - insets.right, HEIGHT - insets.top - insets.bottom);
          mainFrame.add(grid, BorderLayout.CENTER);
 -         mandelbrotController = new MandelbrotController(this, grid);
 +        mandelbrotController = new MandelbrotController(this, grid);
 +        mandelbrotController.redraw();
 +        
 +        mainFrame.setMandelbrotController(mandelbrotController);
 +        mainFrame.setMandelbrotTextFields(this);
          JPanel panel = new JPanel(new FlowLayout());
          button_redraw.addActionListener(new ActionListener() {
 @@ -64,9 +70,13 @@ public class MainWindow implements MandelbrotController.MandelbrotProvider {                  }
              }
          });
 +        panel.add(new JLabel("Center x:"));
          panel.add(field_centerX);
 +        panel.add(new JLabel("y:"));
          panel.add(field_centerY);
 +        panel.add(new JLabel("Scale:"));
          panel.add(field_scale);
 +        panel.add(new JLabel("Repetitions:"));
          panel.add(field_repetitions);
          panel.add(button_redraw);
 @@ -102,5 +112,25 @@ public class MainWindow implements MandelbrotController.MandelbrotProvider {      public int getRepetitions() {
          return Integer.parseInt(field_repetitions.getText());
      }
 +
 +    @Override
 +    public void setCenterX(double x) {
 +        field_centerX.setText(Double.toString(x));
 +    }
 +
 +    @Override
 +    public void setCenterY(double y) {
 +        field_centerY.setText(Double.toString(y));
 +    }
 +
 +    @Override
 +    public void setScale(double scale) {
 +        field_scale.setText(Double.toString(scale));
 +    }
 +
 +    @Override
 +    public void setRepetitions(double repetitions) {
 +        field_repetitions.setText(Double.toString(repetitions));
 +    }
  }
 | 
