-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPlanner.pde
170 lines (147 loc) · 5.69 KB
/
Planner.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
public class Planner
{
ArrayList<Integer> _route = new ArrayList<Integer>();
ArrayList<Integer> _stack = new ArrayList<Integer>();
ArrayList<Integer> _checked = new ArrayList<Integer>();
Board _board;
Planner(Board board) {
_board = board;
}
public Boolean CalculateRoute (Integer trackId1, Integer trackId2) {
println("Begin route berekenen...");
_stack.add(trackId1);
return SearchStack(trackId2);
}
public void ExecuteRoute() {
for (Integer i = 0; i < _route.size(); i++) {
Node currentNode = _board.GetNodeById(_route.get(i));
Element currentElement = currentNode.get("self");
currentElement.Highlight(true);
// size - 1 omdat de laatste in een route altijd een track zal zijn.
// die heeft geen acties
if (i < _route.size() - 1) {
Node nextNode = _board.GetNodeById(_route.get(i + 1));
Element nextElement = nextNode.get("self");
if (currentElement instanceof SwitchTrack) {
// huidige wissel goed zetten
Element currentElementForTerminalB = currentNode.get(Constants.terminal.B.toString());
Element currentElementForTerminalC = currentNode.get(Constants.terminal.C.toString());
if (currentElementForTerminalB != null) {
if (currentElementForTerminalB.Id() == nextElement.Id()) {
((SwitchTrack) currentElement).SwitchToTerminal(Constants.terminal.B);
}
}
if (currentElementForTerminalC != null) {
if (currentElementForTerminalC.Id() == nextElement.Id()) {
((SwitchTrack) currentElement).SwitchToTerminal(Constants.terminal.C);
}
}
}
if (nextElement instanceof SwitchTrack) {
// volgende wissel goed zetten
Element nextElementForTerminalB = nextNode.get(Constants.terminal.B.toString());
Element nextElementForTerminalC = nextNode.get(Constants.terminal.C.toString());
if (nextElementForTerminalB != null) {
if (currentElement.Id() == nextElementForTerminalB.Id()) {
((SwitchTrack) nextElement).SwitchToTerminal(Constants.terminal.B);
}
}
if (nextElementForTerminalC != null) {
if (currentElement.Id() == nextElementForTerminalC.Id()) {
((SwitchTrack) nextElement).SwitchToTerminal(Constants.terminal.C);
}
}
}
}
}
}
private boolean SearchStack(Integer targetId) {
println("===================");
println("stack " + _stack);
println("checked " + _checked);
println("route " + _route);
if (_stack.size() == 0) {
return false;
}
Integer currentNodeId = _stack.remove(0);
if (!_route.contains(currentNodeId)) {
_route.add(currentNodeId);
}
if (currentNodeId == targetId) {
println("Doel gevonden");
println("stack " + _stack);
println("checked " + _checked);
println("route " + _route);
return true;
}
Integer nextNodeId = GetValidUncheckedElementId(currentNodeId);
if (nextNodeId == null) {
// laatste item van route verwijderen en 1 stap terug checken
if (_route.size() > 0) {
_route.remove(_route.size() - 1);
}
if (_route.size() > 0) {
_stack.add(_route.get(_route.size() - 1));
} else {
println("geen route meer over");
println("stack " + _stack);
println("checked " + _checked);
println("route " + _route);
return false;
}
} else {
_stack.add(nextNodeId);
}
if (!_checked.contains(currentNodeId)) {
_checked.add(currentNodeId);
}
return SearchStack(targetId);
}
private Integer GetValidUncheckedElementId(Integer id) {
Node node = _board.GetNodeById(id);
Boolean isValidTerminalA = true, isValidTerminalB = true, isValidTerminalC = true;
if (node.get("self") instanceof SwitchTrack) {
// als de huidige node een wissel is dan moet je weten aan welke terminal de vorige node zit
// route.size() -1 is het laatste item, size - 2 is het voorlaatste item
Constants.terminal lastRouteNodeOnTerminal = GetTerminalById(node, _route.get(_route.size() - 2));
// als de laatse node van de route op terminal a zit, dan alleen b of c checken
if (lastRouteNodeOnTerminal == Constants.terminal.A) {
isValidTerminalA = false;
} else if (lastRouteNodeOnTerminal == Constants.terminal.B || lastRouteNodeOnTerminal == Constants.terminal.C) {
isValidTerminalB = false;
isValidTerminalC = false;
}
// als de laatse node van de route op terminal b of c zit, dan alleen a checken
}
Element el;
el = node.get(Constants.terminal.A.toString());
if (isValidTerminalA && el != null && !_checked.contains(el.Id())) {
return el.Id();
};
el = node.get(Constants.terminal.B.toString());
if (isValidTerminalB && el != null && !_checked.contains(el.Id())) {
return el.Id();
};
el = node.get(Constants.terminal.C.toString());
if (isValidTerminalC && el != null && !_checked.contains(el.Id())) {
return el.Id();
};
return null;
}
private Constants.terminal GetTerminalById(Node node, Integer id) {
// op de gegeven node zoeken of er een terminal is bezet door een element met het gegeven id
Element el = node.get(Constants.terminal.A.toString());
if (el != null && el.Id() == id) {
return Constants.terminal.A;
};
el = node.get(Constants.terminal.B.toString());
if (el != null && el.Id() == id) {
return Constants.terminal.B;
};
el = node.get(Constants.terminal.C.toString());
if (el != null && el.Id() == id) {
return Constants.terminal.C;
};
return null;
}
}