From cb071c4f2020b7733f5dd87fa75a7f2e447c5444 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Wed, 29 Apr 2015 10:29:04 +0200 Subject: This seems to work --- .../mandelbrot/MandelbrotController.java | 41 ++++--- .../src/com/camilstaps/mandelbrot/ZoomFrame.java | 135 +++++++++++++++++++++ Week11 Mandelbrot/src/fractals/MainWindow.java | 46 +++++-- 3 files changed, 199 insertions(+), 23 deletions(-) create mode 100644 Week11 Mandelbrot/src/com/camilstaps/mandelbrot/ZoomFrame.java (limited to 'Week11 Mandelbrot/src') 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)); + } } -- cgit v1.2.3