Correctly derail trains on switches

This commit is contained in:
Arne Keller 2020-02-18 09:47:36 +01:00
parent 461e359b12
commit dab2f23e82
5 changed files with 24 additions and 21 deletions

View File

@ -20,4 +20,7 @@ add train 2 T1-Beta
put train 1 at (0,5) in direction 0,1 put train 1 at (0,5) in direction 0,1
put train 2 at (0,0) in direction 1,0 put train 2 at (0,0) in direction 1,0
step 1 step 1
put train 1 at (0,0) in direction 0,-1
set switch 3 position (0,0)
put train 1 at (0,0) in direction 0,-1
exit exit

View File

@ -24,3 +24,6 @@ electrical engine T1-Beta added to train 2
OK OK
OK OK
Crash of train 1,2 Crash of train 1,2
OK
OK
OK

View File

@ -91,8 +91,12 @@ public class ModelRailwaySimulation {
* @return whether the switch could be set * @return whether the switch could be set
*/ */
public boolean setSwitch(final int id, final Vector2D position) { public boolean setSwitch(final int id, final Vector2D position) {
// TODO Falls Gleiseweichen auf denen ein Zug bereitssteht, geschaltet werden, entgleist der daraufstehende Zug boolean success = railNetwork.setSwitch(id, position);
return railNetwork.setSwitch(id, position); if (success) {
// derail trains on switch TODO: await forum answer on printing derailed trains
trains.values().stream().filter(train -> train.isOnRail(id)).forEach(Train::removeFromRails);
}
return success;
} }
/** /**

View File

@ -27,7 +27,7 @@ public final class Train {
/** /**
* List of positions this train touches. * List of positions this train touches.
*/ */
private List<Vector2D> position; private LinkedList<Vector2D> position;
/** /**
* Direction of the train head. * Direction of the train head.
*/ */
@ -149,7 +149,7 @@ public final class Train {
} }
LinkedList<Vector2D> positions = new LinkedList<>(); LinkedList<Vector2D> positions = new LinkedList<>();
positions.add(position); positions.addLast(position);
Vector2D positioningDirection = direction.negated(); Vector2D positioningDirection = direction.negated();
Vector2D rollingStockPosition = position; Vector2D rollingStockPosition = position;
if (length > 10000) { if (length > 10000) {
@ -163,7 +163,7 @@ public final class Train {
|| (positions.contains(rollingStockPosition) && !positions.get(0).equals(rollingStockPosition))) { || (positions.contains(rollingStockPosition) && !positions.get(0).equals(rollingStockPosition))) {
return false; return false;
} }
positions.add(rollingStockPosition); positions.addLast(rollingStockPosition);
} }
Set<Rail> occupiedRails = new HashSet<>(); Set<Rail> occupiedRails = new HashSet<>();
for (int i = 0; i < positions.size(); i++) { for (int i = 0; i < positions.size(); i++) {
@ -217,7 +217,7 @@ public final class Train {
public Vector2D getFrontPosition() { public Vector2D getFrontPosition() {
if (position != null) { if (position != null) {
// make sure caller can not modify internal data // make sure caller can not modify internal data
return new Vector2D(position.get(0)); return new Vector2D(position.getFirst());
} else { } else {
return null; return null;
} }
@ -229,7 +229,7 @@ public final class Train {
public Vector2D getRearPosition() { public Vector2D getRearPosition() {
if (position != null) { if (position != null) {
// make sure caller can not modify internal data // make sure caller can not modify internal data
return new Vector2D(position.get(position.size() - 1)); return new Vector2D(position.getLast());
} else { } else {
return null; return null;
} }
@ -250,7 +250,7 @@ public final class Train {
if (position.size() == 1) { if (position.size() == 1) {
return direction.negated(); return direction.negated();
} else { } else {
return position.get(position.size() - 1).subtract(position.get(position.size() - 2)); return position.getLast().subtract(position.get(position.size() - 2)); // TODO
} }
} }
@ -269,9 +269,9 @@ public final class Train {
*/ */
public void moveTo(final RailwayNetwork railNetwork, final Vector2D nextPosition) { public void moveTo(final RailwayNetwork railNetwork, final Vector2D nextPosition) {
// make sure caller can not modiy internal state // make sure caller can not modiy internal state
position.add(0, new Vector2D(nextPosition)); position.addFirst(new Vector2D(nextPosition));
Vector2D last = position.remove(position.size() - 1); Vector2D last = position.removeLast();
updateOccupiedRails(railNetwork, position.get(0), last, position.get(position.size() - 1)); updateOccupiedRails(railNetwork, position.getFirst(), last, position.getLast());
} }
/** /**
@ -280,9 +280,9 @@ public final class Train {
* @param rearPosition position to move rear of the train to * @param rearPosition position to move rear of the train to
*/ */
public void moveBackTo(final RailwayNetwork railNetwork, final Vector2D rearPosition) { public void moveBackTo(final RailwayNetwork railNetwork, final Vector2D rearPosition) {
Vector2D last = position.remove(0); Vector2D last = position.removeFirst();
position.add(new Vector2D(rearPosition)); position.addLast(new Vector2D(rearPosition));
updateOccupiedRails(railNetwork, position.get(position.size() - 1), last, position.get(0)); updateOccupiedRails(railNetwork, position.getLast(), last, position.getFirst());
} }
/** /**

View File

@ -1,7 +1,5 @@
package edu.kit.informatik.model; package edu.kit.informatik.model;
import java.util.Objects;
/** /**
* A two-dimensional vector, usually a position or movement direction vector. * A two-dimensional vector, usually a position or movement direction vector.
* *
@ -141,9 +139,4 @@ public class Vector2D {
return false; return false;
} }
@Override
public int hashCode() {
return Objects.hash(x, y);
}
} }