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
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
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
81 }
82
83 public void stop() {
84 log.info("stop");
85 synchronized (running) {
86 running = Boolean.FALSE;
87 }
88
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 }