View Javadoc
1   package org.woehlke.computer.kurzweil.tabs.mandelbrot2julia;
2   
3   import lombok.EqualsAndHashCode;
4   import lombok.Getter;
5   import lombok.ToString;
6   import lombok.extern.log4j.Log4j2;
7   import org.woehlke.computer.kurzweil.commons.layouts.LayoutCanvas;
8   import org.woehlke.computer.kurzweil.commons.tabs.TabCanvas;
9   
10  import javax.swing.*;
11  import javax.swing.border.Border;
12  import java.awt.*;
13  import java.io.Serializable;
14  import java.util.concurrent.ExecutionException;
15  import java.util.concurrent.Future;
16  import java.util.concurrent.TimeUnit;
17  import java.util.concurrent.TimeoutException;
18  
19  
20  /**
21   * Mandelbrot Set drawn by a Turing Machine.
22   *
23   * (C) 2006 - 2013 Thomas Woehlke.
24   * https://thomas-woehlke.blogspot.com/2016/01/mandelbrot-set-drawn-by-turing-machine.html
25   * @author Thomas Woehlke
26   *
27   * Date: 05.02.2006
28   * Time: 00:51:51
29   */
30  @Log4j2
31  @Getter
32  @ToString(callSuper = true, exclude = {"tabCtx","border","preferredSize","layout","model"})
33  @EqualsAndHashCode(callSuper=true, exclude = {"tabCtx","border","preferredSize","layout","model"})
34  public class MandelbrotCanvas extends JComponent implements
35      Serializable, TabCanvas, Mandelbrot, Future<Void> {
36  
37      private final MandelbrotContext tabCtx;
38      private final Border border;
39      private final LayoutCanvas layout;
40  
41      private final MandelbrotModel model;
42      private final Dimension preferredSize;
43  
44      public MandelbrotCanvas(MandelbrotContext tabCtx) {
45          this.tabCtx = tabCtx;
46          this.model = tabCtx.getTabModel();
47          this.border = this.tabCtx.getCtx().getCanvasBorder();
48          this.layout = new LayoutCanvas(this);
49          int width = this.model.getWorldDimensions().getWidth();
50          int height = this.model.getWorldDimensions().getHeight();
51          this.preferredSize = new Dimension(width, height);
52          this.setSize(this.preferredSize);
53          this.setPreferredSize(preferredSize);
54      }
55  
56      @Override
57      public void paint(Graphics g) {
58          this.setSize(this.preferredSize);
59          this.setPreferredSize(preferredSize);
60          super.paintComponent(g);
61          int red = 0;
62          int green = 0;
63          int blue = 0;
64          for(int y = 0; y < model.getWorldDimensions().getY(); y++){
65              for(int x = 0; x < model.getWorldDimensions().getX(); x++){
66                  blue = (((model.getCellStatusFor(x,y))*4)%256);
67                  Color stateColor = new Color(red, green, blue);
68                  g.setColor(stateColor);
69                  g.drawLine(x,y,x,y);
70              }
71          }
72      }
73  
74      @Override
75      public void update(Graphics g) {
76          paint(g);
77      }
78  
79      @Override
80      public boolean cancel(boolean mayInterruptIfRunning) {
81          return false;
82      }
83  
84      @Override
85      public boolean isCancelled() {
86          return false;
87      }
88  
89      @Override
90      public boolean isDone() {
91          return false;
92      }
93  
94      @Override
95      public Void get() throws InterruptedException, ExecutionException {
96          return null;
97      }
98  
99      @Override
100     public Void get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
101         return null;
102     }
103 
104     @Override
105     public void showMe() {
106         log.info("showMe "+this.toString());
107     }
108 }