View Javadoc
1   package org.woehlke.computer.kurzweil.tabs.randomwalk;
2   
3   import lombok.EqualsAndHashCode;
4   import lombok.Getter;
5   import lombok.extern.log4j.Log4j2;
6   import org.woehlke.computer.kurzweil.commons.model.LatticePoint;
7   import org.woehlke.computer.kurzweil.commons.tabs.TabModel;
8   import org.woehlke.computer.kurzweil.tabs.randomwalk.canvas.ParticleOrientation;
9   import org.woehlke.computer.kurzweil.tabs.randomwalk.canvas.RandomWalkColorScheme;
10  
11  import java.awt.*;
12  import java.util.concurrent.ForkJoinTask;
13  
14  @Log4j2
15  @Getter
16  @EqualsAndHashCode(callSuper=false,exclude = {"tabCtx"})
17  public class RandomWalkModel extends ForkJoinTask<Void> implements TabModel, RandomWalk {
18  
19      private final RandomWalkContext tabCtx;
20      private final Dimension preferredSize;
21      private final RandomWalkColorScheme colorScheme;
22      private volatile long[][] lattice;
23      private Boolean running;
24      private LatticePoint particlePosition;
25  
26      private final static int startX = 0;
27      private final static int startY = 0;
28      private final int worldX;
29      private final int worldY;
30  
31  
32      public RandomWalkModel(RandomWalkContext tabCtx) {
33          this.tabCtx = tabCtx;
34          this.worldX = this.tabCtx.getCtx().getWorldDimensions().getX();
35          this.worldY = this.tabCtx.getCtx().getWorldDimensions().getY();
36          this.preferredSize = new Dimension(worldX,worldY);
37          this.colorScheme = new RandomWalkColorScheme();
38          this.particlePosition = new LatticePoint(worldX/2,worldY/2);
39          this.running = Boolean.FALSE;
40      }
41  
42      @Override
43      protected boolean exec() {
44          boolean doIt = false;
45          synchronized (running) {
46              doIt = running.booleanValue();
47          }
48          if(doIt){
49              //log.info("step");
50              int x = particlePosition.getX();
51              int y = particlePosition.getY();
52              int randomOrientation = this.tabCtx.getCtx().getRandom().nextInt(ParticleOrientation.values().length);
53              LatticePoint move = ParticleOrientation.values()[randomOrientation].getMove();
54              x = (x + move.getX() + worldX ) % worldX;
55              y = (y + move.getY() + worldY ) % worldY;
56              particlePosition.setX(x);
57              particlePosition.setY(y);
58              lattice[x][y] = (lattice[x][y] + 10) * 2;
59              //log.info("stepped ("+x+","+y+" = "+ lattice[x][y]+") "+ParticleOrientation.values()[randomOrientation].name());
60          }
61          return doIt;
62      }
63  
64      public void resetLattice(){
65          lattice = new long[worldX][worldY];
66          int x;
67          int y;
68          for(y = 0; y <worldY; y++){
69              for(x=0; x < worldX; x++){
70                  lattice[x][y]=0;
71              }
72          }
73      }
74  
75      public void start() {
76          log.info("start");
77          synchronized (running) {
78              running = Boolean.TRUE;
79          }
80          //log.info("started "+this.toString());
81      }
82  
83      public void stop() {
84          log.info("stop");
85          synchronized (running) {
86              running = Boolean.FALSE;
87          }
88          //log.info("stopped "+this.toString());
89      }
90  
91      @Override
92      public Void getRawResult() {
93          return null;
94      }
95  
96      @Override
97      protected void setRawResult(Void value) {
98  
99      }
100 
101 }