diff options
author | Camil Staps | 2015-04-29 10:29:04 +0200 |
---|---|---|
committer | Camil Staps | 2015-04-29 10:29:04 +0200 |
commit | cb071c4f2020b7733f5dd87fa75a7f2e447c5444 (patch) | |
tree | a95f5ad65bca7595e667b604a6471a5ba0526239 /Week11 Mandelbrot | |
parent | Simple interface working (diff) |
This seems to work
Diffstat (limited to 'Week11 Mandelbrot')
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));
+ }
}
|