View Javadoc
1   package org.woehlke.computer.kurzweil.commons.model.turing;
2   
3   /**
4    * Mandelbrot Set drawn by a Turing Machine.
5    *
6    * (C) 2006 - 2015 Thomas Woehlke.
7    * https://thomas-woehlke.blogspot.com/2016/01/mandelbrot-set-drawn-by-turing-machine.html
8    * @author Thomas Woehlke
9    *
10   * Created by tw on 16.12.2019.
11   */
12  public class MandelbrotTuringPositions {
13  
14      private volatile Point turingPosition;
15      private volatile Point worldDimensions;
16      private volatile Point firstSetPosition;
17  
18      private volatile MandelbrotTuringDirection turingDirection;
19  
20      private volatile int steps;
21  
22      public MandelbrotTuringPositions(Point worldDimensions) {
23          this.worldDimensions = worldDimensions;
24          start();
25      }
26  
27      public void start() {
28          this.steps = 0;
29          this.turingPosition = new Point((worldDimensions.getX()-2),(worldDimensions.getY()/2+11));
30          this.turingDirection = MandelbrotTuringDirection.LEFT;
31      }
32  
33      public synchronized void markFirstSetPosition(){
34          this.firstSetPosition = turingPosition;
35          this.steps = 0;
36      }
37  
38      public synchronized Point getTuringPosition() {
39          return turingPosition;
40      }
41  
42      public synchronized void goForward() {
43          this.steps++;
44          switch (this.turingDirection){
45              case UP:
46                  this.turingPosition.moveUp();
47                  break;
48              case RIGHT:
49                  this.turingPosition.moveRight();
50                  break;
51              case DOWN:
52                  this.turingPosition.moveDown();
53                  break;
54              case LEFT:
55                  this.turingPosition.moveLeft();
56                  break;
57              default:
58                  break;
59          }
60      }
61  
62      public synchronized void turnRight() {
63          MandelbrotTuringDirection newTuringDirection;
64          switch (this.turingDirection){
65              case UP: newTuringDirection = MandelbrotTuringDirection.RIGHT; break;
66              case RIGHT: newTuringDirection = MandelbrotTuringDirection.DOWN; break;
67              case DOWN: newTuringDirection = MandelbrotTuringDirection.LEFT; break;
68              case LEFT: newTuringDirection = MandelbrotTuringDirection.UP; break;
69              default: newTuringDirection = this.turingDirection; break;
70          }
71          this.turingDirection = newTuringDirection;
72      }
73  
74      public synchronized void turnLeft() {
75          MandelbrotTuringDirection newTuringDirection;
76          switch (this.turingDirection){
77              case UP: newTuringDirection = MandelbrotTuringDirection.LEFT; break;
78              case RIGHT: newTuringDirection = MandelbrotTuringDirection.UP; break;
79              case DOWN: newTuringDirection = MandelbrotTuringDirection.RIGHT; break;
80              case LEFT: newTuringDirection = MandelbrotTuringDirection.DOWN; break;
81              default: newTuringDirection = this.turingDirection; break;
82          }
83          this.turingDirection = newTuringDirection;
84      }
85  
86      public synchronized boolean isFinishedWalkAround() {
87          return (this.turingPosition.equals(this.firstSetPosition)) && (this.steps>100);
88      }
89  
90  }