aboutsummaryrefslogtreecommitdiff
path: root/Week11 Mandelbrot
diff options
context:
space:
mode:
authorCamil Staps2015-04-29 10:29:04 +0200
committerCamil Staps2015-04-29 10:29:04 +0200
commitcb071c4f2020b7733f5dd87fa75a7f2e447c5444 (patch)
treea95f5ad65bca7595e667b604a6471a5ba0526239 /Week11 Mandelbrot
parentSimple interface working (diff)
This seems to work
Diffstat (limited to 'Week11 Mandelbrot')
-rw-r--r--Week11 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotController.java41
-rw-r--r--Week11 Mandelbrot/src/com/camilstaps/mandelbrot/ZoomFrame.java135
-rw-r--r--Week11 Mandelbrot/src/fractals/MainWindow.java46
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));
+ }
}