From 033198ca2c7e2d2b877b2b14a35d7f4bd3ee633a Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 28 Apr 2017 00:53:07 +1200 Subject: [PATCH 1/3] Linked the streamedRace course to the visualiser, linked the boats to the visualiser (this needs to be tests) #story[768] --- .../main/java/seng302/Mock/StreamedBoat.java | 46 ++++++--- .../main/java/seng302/Mock/StreamedRace.java | 95 ++++++++++++++++++- .../src/main/java/seng302/Model/Boat.java | 2 +- .../main/java/seng302/Model/BoatInRace.java | 4 +- .../seng302/Model/ResizableRaceCanvas.java | 75 +++++++++++---- 5 files changed, 180 insertions(+), 42 deletions(-) diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index 0ff629a0..ad458e4b 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -1,44 +1,60 @@ package seng302.Mock; import javafx.scene.paint.Color; +import org.geotools.referencing.GeodeticCalculator; import seng302.GPSCoordinate; import seng302.Model.Boat; import seng302.Model.BoatInRace; +import seng302.Model.Leg; +import seng302.Model.Marker; /** * Created by Joseph on 24/04/2017. */ public class StreamedBoat extends BoatInRace { private int sourceID; - private boolean complete; + private boolean dnf = false; + + private void init() { + this.velocity = 0; + this.scaledVelocity = 0; + this.heading = 0; + this.setCurrentLeg(new Leg("None", -1)); + this.setCurrentPosition(new GPSCoordinate(0, 0)); + } public StreamedBoat(int sourceID, String name, Color colour, String abbrev) { super(name, colour, abbrev); this.sourceID = sourceID; - this.complete = true; + this.init(); } public StreamedBoat(int sourceID) { super("None", Color.BLACK, "None"); this.sourceID = sourceID; - this.complete = false; + this.init(); } - /** - * Overridden to ignore this function - * @deprecated - * @return 0 + * Calculates the azimuth of the travel via heading of the boat + * + * @return the direction that the boat is heading towards in degrees (-180 to 180). */ - public double getScaledVelocity() { - return 0; + public double calculateAzimuth() { + double azimuth; + if (heading <= 180) { + azimuth = heading; + } else { + azimuth = -heading + 180; + } + return azimuth; } - /** - * Overridden to ignore this function - * @deprecated - * @param velocity of boat - */ - public void setScaledVelocity(double velocity) { + public boolean isDnf() { + return dnf; + } + + public void setDnf(boolean dnf) { + this.dnf = dnf; } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index 56b6a114..c1035d7b 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -1,12 +1,14 @@ package seng302.Mock; import javafx.collections.FXCollections; +import org.geotools.referencing.GeodeticCalculator; +import seng302.Constants; import seng302.Controllers.RaceController; -import seng302.Model.BoatInRace; -import seng302.Model.Leg; -import seng302.Model.Race; +import seng302.GPSCoordinate; +import seng302.Model.*; import seng302.RaceDataSource; +import java.awt.geom.Point2D; import java.util.*; /** @@ -18,10 +20,23 @@ public class StreamedRace extends Race { public StreamedRace(RaceDataSource raceData, RaceController controller, int scaleFactor) { super(raceData.getBoats(), raceData.getLegs(), controller, scaleFactor); this.raceData = raceData; + this.scaleFactor = 1; // There will be no scaling in a live streamed race } public void initialiseBoats() { + Leg officialStart = legs.get(0); + String name = officialStart.getName(); + Marker endMarker = officialStart.getEndMarker(); + for (int i = 0; i < startingBoats.size(); i++) { + BoatInRace boat = startingBoats.get(i); + if (boat != null) { + Leg startLeg = new Leg(name, 0); + startLeg.setEndMarker(endMarker); + boat.setCurrentLeg(startLeg); + boat.setHeading(boat.calculateHeading()); + } + } } /** @@ -29,6 +44,7 @@ public class StreamedRace extends Race { * @return True if boat cannot finish the race */ protected boolean doNotFinish() { + // DNF is no longer random and is now determined by a dnf packet return false; } @@ -39,17 +55,86 @@ public class StreamedRace extends Race { * @param timeElapsed Time that has elapse since the start of the the race. * @see BoatInRace */ + protected void checkPosition(StreamedBoat boat, long timeElapsed) { + if (boat.getCurrentLeg().getName().toLowerCase().contains("finish")) { + //boat has finished + boatsFinished++; + boat.setFinished(true); + boat.setTimeFinished(timeElapsed); + } else if (boat.isDnf()) { + boatsFinished++; + boat.setFinished(true); + boat.setCurrentLeg(new Leg("DNF", -1)); + boat.setVelocity(0); + boat.setScaledVelocity(0); + } + //Update the boat display table in the GUI to reflect the leg change + updatePositions(); + } + + /** + * Updates the boat's gps coordinates + * + * @param boat to be updated + * @param millisecondsElapsed time since last update + */ + protected void updatePosition(StreamedBoat boat, int millisecondsElapsed) { + //distanceTravelled = velocity (nm p hr) * time taken to update loop + double distanceTravelled = (boat.getVelocity() * millisecondsElapsed) / 3600000; + + boolean finish = boat.getCurrentLeg().getName().toLowerCase().contains("finish"); + if (!finish) { + //Calculate boat's new position by adding the distance travelled onto the start point of the leg + boat.setCurrentPosition(calculatePosition(boat.getCurrentPosition(), distanceTravelled, boat.calculateAzimuth())); + } + } + + protected void setPostion(StreamedBoat boat, GPSCoordinate coordinate) { + boat.setCurrentPosition(coordinate); + } + + /** + * Calculates the boats next GPS position based on its distance travelled and heading + * + * @param oldCoordinates GPS coordinates of the boat's starting position + * @param distanceTravelled distance in nautical miles + * @param azimuth boat's current direction. Value between -180 and 180 + * @return The boat's new coordinate + */ + public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { + + //Find new coordinate using current heading and distance + + GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); + //Load start point into calculator + Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); + geodeticCalculator.setStartingGeographicPoint(startPoint); + //load direction and distance travelled into calculator + geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); + //get new point + Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); + + return new GPSCoordinate(endPoint.getY(), endPoint.getX()); + } + + /** + * Checks the position of the boat, this updates the boats current position. + * @deprecated + * @param boat Boat that the postion is to be updated for. + * @param timeElapsed Time that has elapse since the start of the the race. + * @see BoatInRace + */ protected void checkPosition(BoatInRace boat, long timeElapsed) { } /** * Updates the boat's gps coordinates - * + * @deprecated * @param boat to be updated * @param millisecondsElapsed time since last update */ - protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { + protected void updatePosition(BoatInRace boat, int millisecondsElapsed){ } diff --git a/visualiser/src/main/java/seng302/Model/Boat.java b/visualiser/src/main/java/seng302/Model/Boat.java index a3e269d4..4ea9d8ab 100644 --- a/visualiser/src/main/java/seng302/Model/Boat.java +++ b/visualiser/src/main/java/seng302/Model/Boat.java @@ -9,7 +9,7 @@ import javafx.beans.property.StringProperty; public class Boat { private StringProperty name; - private double velocity; + protected double velocity; private StringProperty velocityProp; private String abbrev; diff --git a/visualiser/src/main/java/seng302/Model/BoatInRace.java b/visualiser/src/main/java/seng302/Model/BoatInRace.java index 6f835593..42d9fcb7 100644 --- a/visualiser/src/main/java/seng302/Model/BoatInRace.java +++ b/visualiser/src/main/java/seng302/Model/BoatInRace.java @@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class BoatInRace extends Boat { protected Leg currentLeg; - private double scaledVelocity; + protected double scaledVelocity; protected double distanceTravelledInLeg; protected GPSCoordinate currentPosition; protected long timeFinished; @@ -111,7 +111,7 @@ public class BoatInRace extends Boat { * @return the direction that the boat is heading towards in degrees (0 to 360). */ public double calculateHeading() { - double azimuth = this.calculateAzimuth(); + double azimuth = calculateAzimuth(); return calculateHeading(azimuth); } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index dd8287dc..1df65127 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -22,6 +22,7 @@ public class ResizableRaceCanvas extends Canvas { private GraphicsContext gc; private RaceMap map; private List boats; + private RaceDataSource raceData; private boolean raceAnno = true; private boolean annoName = true; private boolean annoAbbrev = true; @@ -41,6 +42,8 @@ public class ResizableRaceCanvas extends Canvas { double lat2 = raceData.getMapBottomRight().getLatitude(); double long2 = raceData.getMapBottomRight().getLongitude(); setMap(new RaceMap(lat1, long1, lat2, long2, (int) getWidth(), (int) getHeight())); + + this.raceData = raceData; } /** @@ -225,30 +228,64 @@ public class ResizableRaceCanvas extends Canvas { //finish line gc.setLineWidth(2); drawBoundaries(); - GraphCoordinate finishLineCoord1 = this.map.convertGPS(Constants.finishLineMarker1); - GraphCoordinate finishLineCoord2 = this.map.convertGPS(Constants.finishLineMarker2); - displayLine(finishLineCoord1, finishLineCoord2, Color.DARKRED); - //marks - GraphCoordinate markCoord = this.map.convertGPS(Constants.mark1); - GraphCoordinate windwardGate1 = this.map.convertGPS(Constants.windwardGate1); - GraphCoordinate windwardGate2 = this.map.convertGPS(Constants.windwardGate2); - GraphCoordinate leewardGate1 = this.map.convertGPS(Constants.leewardGate1); - GraphCoordinate leewardGate2 = this.map.convertGPS(Constants.leewardGate2); - displayMark(markCoord, Color.GOLD); - displayLine(windwardGate1, windwardGate2, Color.DARKCYAN); - displayLine(leewardGate1, leewardGate2, Color.DARKVIOLET); - //start line - GraphCoordinate startline1 = this.map.convertGPS(Constants.startLineMarker1); - GraphCoordinate startline2 = this.map.convertGPS(Constants.startLineMarker2); - - displayLine(startline1, startline2, Color.GREEN); - + drawPoints(); updateBoats(); //display wind direction arrow - specify origin point and angle - angle now set to random angle displayArrow(new GraphCoordinate((int) getWidth() - 40, 40), 150); } + private void drawPoints() { +// GraphCoordinate finishLineCoord1 = this.map.convertGPS(Constants.finishLineMarker1); +// GraphCoordinate finishLineCoord2 = this.map.convertGPS(Constants.finishLineMarker2); +// displayLine(finishLineCoord1, finishLineCoord2, Color.DARKRED); +// //marks +// GraphCoordinate markCoord = this.map.convertGPS(Constants.mark1); +// GraphCoordinate windwardGate1 = this.map.convertGPS(Constants.windwardGate1); +// GraphCoordinate windwardGate2 = this.map.convertGPS(Constants.windwardGate2); +// GraphCoordinate leewardGate1 = this.map.convertGPS(Constants.leewardGate1); +// GraphCoordinate leewardGate2 = this.map.convertGPS(Constants.leewardGate2); +// displayMark(markCoord, Color.GOLD); +// displayLine(windwardGate1, windwardGate2, Color.DARKCYAN); +// displayLine(leewardGate1, leewardGate2, Color.DARKVIOLET); +// //start line +// GraphCoordinate startline1 = this.map.convertGPS(Constants.startLineMarker1); +// GraphCoordinate startline2 = this.map.convertGPS(Constants.startLineMarker2); +// +// displayLine(startline1, startline2, Color.GREEN); + + for (Leg leg : raceData.getLegs()) { + boolean hasStart = false; + boolean hasEnd = false; + GraphCoordinate start1 = null; + GraphCoordinate start2 = null; + GraphCoordinate end1 = null; + GraphCoordinate end2 = null; + String legName = leg.getName().toLowerCase(); + if (leg.getStartMarker() != null) { + start1 = this.map.convertGPS(leg.getStartMarker().getMark1()); + start2 = this.map.convertGPS(leg.getStartMarker().getMark2()); + hasStart = true; + } if (leg.getEndMarker() != null) { + end1 = this.map.convertGPS(leg.getEndMarker().getMark1()); + end2 = this.map.convertGPS(leg.getEndMarker().getMark2()); + hasEnd = true; + } + + if (legName.contains("line") || legName.contains("gate")) { + if (hasStart && start1 != null && start2 != null) displayLine(start1, start2, Color.BLACK); + if (hasEnd && start1 != null && start2 != null) displayLine(end1, end2, Color.BLACK); + } else if (hasStart && start1 != null && start2 != null) { + if (legName.contains("start")) displayLine(start1, start2, Color.BLACK); + else displayMark(start1, Color.BLACK); + } + else if (hasEnd && end1 != null && end2 != null) { + if (legName.contains("finish")) displayLine(end1, end2, Color.BLACK); + else displayMark(end1, Color.BLACK); + } + } + } + /** * Draws a boat at a certain GPSCoordinate * @@ -319,7 +356,7 @@ public class ResizableRaceCanvas extends Canvas { */ public void updateBoats() { // TODO Remove null when boats are ready - boats = null; + //boats = null; if (boats != null) { for (BoatInRace boat : boats) { boolean finished = boat.getCurrentLeg().getName().equals("Finish") || boat.getCurrentLeg().getName().equals("DNF"); From f377cf6471584c60e4d763ebcb207ba9d8b79b83 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Fri, 28 Apr 2017 12:35:00 +1200 Subject: [PATCH 2/3] Changed it so Boat can be used as a superclass for StreamedBoat and BoatInRace properly and removed ConstantVelocityRace. Everything that used to use BoatInRace or StreamedBoat now uses it superclass (boat). #pair[jjg64, cbt24] #refactor #story[782] --- .../seng302/Controllers/RaceController.java | 12 +- .../seng302/Controllers/StartController.java | 12 +- .../main/java/seng302/Mock/BoatXMLReader.java | 5 + .../main/java/seng302/Mock/StreamedBoat.java | 18 +- .../java/seng302/Mock/StreamedCourse.java | 9 +- .../main/java/seng302/Mock/StreamedRace.java | 70 +-- .../src/main/java/seng302/Model/Boat.java | 140 +++++- .../main/java/seng302/Model/BoatInRace.java | 17 - .../seng302/Model/ConstantVelocityRace.java | 416 +++++++++--------- .../src/main/java/seng302/Model/Race.java | 39 +- .../main/java/seng302/Model/RaceClock.java | 1 + .../seng302/Model/ResizableRaceCanvas.java | 42 +- .../src/main/java/seng302/RaceDataSource.java | 3 +- .../src/main/java/seng302/RaceXMLReader.java | 4 +- .../Model/ConstantVelocityRaceTest.java | 280 ++++++------ .../test/java/seng302/Model/RaceXMLTest.java | 2 +- 16 files changed, 572 insertions(+), 498 deletions(-) diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index 69bbf74b..9f1a55f7 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -61,15 +61,15 @@ public class RaceController extends Controller { Button showSetAnno; @FXML - TableView boatInfoTable; + TableView boatInfoTable; @FXML - TableColumn boatPlacingColumn; + TableColumn boatPlacingColumn; @FXML - TableColumn boatTeamColumn; + TableColumn boatTeamColumn; @FXML - TableColumn boatMarkColumn; + TableColumn boatMarkColumn; @FXML - TableColumn boatSpeedColumn; + TableColumn boatSpeedColumn; /** * Updates the ResizableRaceCanvas (raceMap) with most recent data @@ -77,7 +77,7 @@ public class RaceController extends Controller { * @param boats boats that are to be displayed in the race * @see ResizableRaceCanvas */ - public void updateMap(ObservableList boats) { + public void updateMap(ObservableList boats) { raceMap.setBoats(boats); raceMap.update(); } diff --git a/visualiser/src/main/java/seng302/Controllers/StartController.java b/visualiser/src/main/java/seng302/Controllers/StartController.java index 4c70a1a2..859b2264 100644 --- a/visualiser/src/main/java/seng302/Controllers/StartController.java +++ b/visualiser/src/main/java/seng302/Controllers/StartController.java @@ -14,7 +14,7 @@ import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import org.xml.sax.SAXException; import seng302.Mock.*; -import seng302.Model.BoatInRace; +import seng302.Model.Boat; import seng302.Model.RaceClock; import seng302.RaceDataSource; import seng302.RaceXMLReader; @@ -34,9 +34,9 @@ public class StartController extends Controller { @FXML private GridPane start; @FXML private AnchorPane startWrapper; - @FXML private TableView boatNameTable; - @FXML private TableColumn boatNameColumn; - @FXML private TableColumn boatCodeColumn; + @FXML private TableView boatNameTable; + @FXML private TableColumn boatNameColumn; + @FXML private TableColumn boatCodeColumn; @FXML private Label timeZoneTime; @FXML private Label timer; @FXML private int PRERACE_TIME = 15000; @@ -107,8 +107,8 @@ public class StartController extends Controller { } private void initialiseTables() { - List boats = raceData.getBoats(); - ObservableList observableBoats = FXCollections.observableArrayList(boats); + List boats = raceData.getBoats(); + ObservableList observableBoats = FXCollections.observableArrayList(boats); boatNameTable.setItems(observableBoats); boatNameColumn.setCellValueFactory(cellData -> cellData.getValue().getName()); diff --git a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java index a7d429dc..386eb3fa 100644 --- a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java @@ -5,6 +5,7 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; +import seng302.Model.Boat; import seng302.XMLReader; import javax.xml.parsers.ParserConfigurationException; @@ -153,4 +154,8 @@ public class BoatXMLReader extends XMLReader { public Map getStreamedBoatMap() { return streamedBoatMap; } + + public List getBoats() { + return new ArrayList<>(streamedBoatMap.values()); + } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index ad458e4b..88b025be 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -11,26 +11,22 @@ import seng302.Model.Marker; /** * Created by Joseph on 24/04/2017. */ -public class StreamedBoat extends BoatInRace { +public class StreamedBoat extends Boat { private int sourceID; private boolean dnf = false; private void init() { this.velocity = 0; - this.scaledVelocity = 0; - this.heading = 0; - this.setCurrentLeg(new Leg("None", -1)); - this.setCurrentPosition(new GPSCoordinate(0, 0)); } public StreamedBoat(int sourceID, String name, Color colour, String abbrev) { - super(name, colour, abbrev); + super(name, abbrev); this.sourceID = sourceID; this.init(); } public StreamedBoat(int sourceID) { - super("None", Color.BLACK, "None"); + super("None", "None"); this.sourceID = sourceID; this.init(); } @@ -49,12 +45,4 @@ public class StreamedBoat extends BoatInRace { } return azimuth; } - - public boolean isDnf() { - return dnf; - } - - public void setDnf(boolean dnf) { - this.dnf = dnf; - } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index f2bcfed0..fb46ee81 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -1,10 +1,7 @@ package seng302.Mock; import seng302.GPSCoordinate; -import seng302.Model.BoatInRace; -import seng302.Model.Leg; -import seng302.Model.Marker; -import seng302.Model.RaceClock; +import seng302.Model.*; import seng302.RaceDataSource; import java.time.ZonedDateTime; @@ -51,8 +48,8 @@ public class StreamedCourse implements RaceDataSource { return regattaXMLReader; } - public List getBoats() { - return new ArrayList<>(boatXMLReader.getStreamedBoatMap().values()); + public List getBoats() { + return boatXMLReader.getBoats(); } public List getLegs() { diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index c1035d7b..375d7502 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -29,12 +29,11 @@ public class StreamedRace extends Race { Marker endMarker = officialStart.getEndMarker(); for (int i = 0; i < startingBoats.size(); i++) { - BoatInRace boat = startingBoats.get(i); + Boat boat = startingBoats.get(i); if (boat != null) { Leg startLeg = new Leg(name, 0); startLeg.setEndMarker(endMarker); boat.setCurrentLeg(startLeg); - boat.setHeading(boat.calculateHeading()); } } } @@ -55,18 +54,12 @@ public class StreamedRace extends Race { * @param timeElapsed Time that has elapse since the start of the the race. * @see BoatInRace */ - protected void checkPosition(StreamedBoat boat, long timeElapsed) { + protected void checkPosition(Boat boat, long timeElapsed) { if (boat.getCurrentLeg().getName().toLowerCase().contains("finish")) { //boat has finished boatsFinished++; boat.setFinished(true); boat.setTimeFinished(timeElapsed); - } else if (boat.isDnf()) { - boatsFinished++; - boat.setFinished(true); - boat.setCurrentLeg(new Leg("DNF", -1)); - boat.setVelocity(0); - boat.setScaledVelocity(0); } //Update the boat display table in the GUI to reflect the leg change updatePositions(); @@ -78,64 +71,13 @@ public class StreamedRace extends Race { * @param boat to be updated * @param millisecondsElapsed time since last update */ - protected void updatePosition(StreamedBoat boat, int millisecondsElapsed) { - //distanceTravelled = velocity (nm p hr) * time taken to update loop - double distanceTravelled = (boat.getVelocity() * millisecondsElapsed) / 3600000; - - boolean finish = boat.getCurrentLeg().getName().toLowerCase().contains("finish"); - if (!finish) { - //Calculate boat's new position by adding the distance travelled onto the start point of the leg - boat.setCurrentPosition(calculatePosition(boat.getCurrentPosition(), distanceTravelled, boat.calculateAzimuth())); - } + protected void updatePosition(Boat boat, int millisecondsElapsed) { + //TODO Grab info from network + // setPostiion(boat, coordinate); } - protected void setPostion(StreamedBoat boat, GPSCoordinate coordinate) { + protected void setPostion(Boat boat, GPSCoordinate coordinate) { boat.setCurrentPosition(coordinate); } - /** - * Calculates the boats next GPS position based on its distance travelled and heading - * - * @param oldCoordinates GPS coordinates of the boat's starting position - * @param distanceTravelled distance in nautical miles - * @param azimuth boat's current direction. Value between -180 and 180 - * @return The boat's new coordinate - */ - public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { - - //Find new coordinate using current heading and distance - - GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); - //Load start point into calculator - Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); - geodeticCalculator.setStartingGeographicPoint(startPoint); - //load direction and distance travelled into calculator - geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); - //get new point - Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); - - return new GPSCoordinate(endPoint.getY(), endPoint.getX()); - } - - /** - * Checks the position of the boat, this updates the boats current position. - * @deprecated - * @param boat Boat that the postion is to be updated for. - * @param timeElapsed Time that has elapse since the start of the the race. - * @see BoatInRace - */ - protected void checkPosition(BoatInRace boat, long timeElapsed) { - - } - - /** - * Updates the boat's gps coordinates - * @deprecated - * @param boat to be updated - * @param millisecondsElapsed time since last update - */ - protected void updatePosition(BoatInRace boat, int millisecondsElapsed){ - - } - } diff --git a/visualiser/src/main/java/seng302/Model/Boat.java b/visualiser/src/main/java/seng302/Model/Boat.java index 4ea9d8ab..f55aa6a0 100644 --- a/visualiser/src/main/java/seng302/Model/Boat.java +++ b/visualiser/src/main/java/seng302/Model/Boat.java @@ -2,16 +2,39 @@ package seng302.Model; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; +import org.geotools.referencing.GeodeticCalculator; +import seng302.Constants; +import seng302.GPSCoordinate; + +import java.awt.geom.Point2D; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; /** * Created by fwy13 on 3/03/17. */ public class Boat { - private StringProperty name; + protected StringProperty name; protected double velocity; private StringProperty velocityProp; - private String abbrev; + protected String abbrev; + protected GPSCoordinate currentPosition; + protected double heading; + protected Leg currentLeg; + protected StringProperty currentLegName; + protected boolean finished = false; + protected long timeFinished; + protected StringProperty position; + protected boolean started = false; + private double wakeScale = 1 / 50; + + protected Queue track = new ConcurrentLinkedQueue<>(); + protected long nextValidTime = 0; + + protected static final float BASE_TRACK_POINT_TIME_INTERVAL = 5000; + protected static float trackPointTimeInterval = 5000; // every 1 seconds + protected final int TRACK_POINT_LIMIT = 10; /** * Boat initialiser which keeps all of the information of the boat. @@ -25,6 +48,8 @@ public class Boat { this.velocityProp = new SimpleStringProperty(String.valueOf(Math.round(velocity))); this.abbrev = abbrev; this.name = new SimpleStringProperty(name); + currentLegName = new SimpleStringProperty(""); + position = new SimpleStringProperty("-"); } /** @@ -34,8 +59,52 @@ public class Boat { * @param abbrev nam abbreviation */ public Boat(String name, String abbrev) { - this.abbrev = abbrev; - this.name = new SimpleStringProperty(name); + this(name, 0, abbrev); + } + + /** + * Returns the position of the end of the boat's wake, which is 180 degrees + * from the boat's heading, and whose length is proportional to the boat's + * speed. + * + * @return GPSCoordinate of wake endpoint. + */ + public GPSCoordinate getWake() { + double reverseHeading = getHeading() - 180; + double distance = wakeScale * getVelocity(); + + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint( + new Point2D.Double(getCurrentPosition().getLongitude(), getCurrentPosition().getLatitude()) + ); + calc.setDirection(reverseHeading, distance); + Point2D endpoint = calc.getDestinationGeographicPoint(); + return new GPSCoordinate(endpoint.getY(), endpoint.getX()); + } + + /** + * Adds a new point to boat's track. + * @param coordinate of point on track + * @return whether add is successful + * @see seng302.Model.TrackPoint + */ + public boolean addTrackPoint(GPSCoordinate coordinate) { + Boolean added = System.currentTimeMillis() >= nextValidTime; + long currentTime = System.currentTimeMillis(); + if (added && this.started) { + nextValidTime = currentTime + (long) trackPointTimeInterval; + track.add(new TrackPoint(coordinate, currentTime, TRACK_POINT_LIMIT * (long) trackPointTimeInterval)); + } + return added; + } + + /** + * Returns the boat's sampled track between start of race and current time. + * @return queue of track points + * @see seng302.Model.TrackPoint + */ + public Queue getTrack() { + return track; } /** @@ -94,4 +163,67 @@ public class Boat { return abbrev; } + public GPSCoordinate getCurrentPosition() { + return currentPosition; + } + + public void setCurrentPosition(GPSCoordinate currentPosition) { + this.currentPosition = currentPosition; + } + + public double getHeading() { + return heading; + } + + public void setHeading(double heading) { + this.heading = heading; + } + + public Leg getCurrentLeg() { + return currentLeg; + } + + public void setCurrentLeg(Leg currentLeg) { + this.currentLeg = currentLeg; + this.currentLegName.setValue(currentLeg.getName()); + } + + public boolean isFinished() { + return finished; + } + + public void setFinished(boolean finished) { + this.finished = finished; + } + + public long getTimeFinished() { + return timeFinished; + } + + public void setTimeFinished(long timeFinished) { + this.timeFinished = timeFinished; + } + + public StringProperty positionProperty() { + return position; + } + + public void setPosition(String position) { + this.position.set(position); + } + + public boolean isStarted() { + return started; + } + + public void setStarted(boolean started) { + this.started = started; + } + + /** + * @return Name of boat's current leg + */ + public StringProperty getCurrentLegName() { + return currentLegName; + } } diff --git a/visualiser/src/main/java/seng302/Model/BoatInRace.java b/visualiser/src/main/java/seng302/Model/BoatInRace.java index 42d9fcb7..3cc3f8d7 100644 --- a/visualiser/src/main/java/seng302/Model/BoatInRace.java +++ b/visualiser/src/main/java/seng302/Model/BoatInRace.java @@ -35,7 +35,6 @@ public class BoatInRace extends Boat { protected static final float BASE_TRACK_POINT_TIME_INTERVAL = 5000; protected static float trackPointTimeInterval = 5000; // every 1 seconds protected final int TRACK_POINT_LIMIT = 10; - protected boolean trackVisible = true; /** * Constructor method. @@ -309,22 +308,6 @@ public class BoatInRace extends Boat { return track; } - /** - * Returns whether track is visible - * @return true if visible - */ - public boolean isTrackVisible() { - return trackVisible; - } - - /** - * Sets track visibility. - * @param trackVisible visible if true. - */ - public void setTrackVisible(boolean trackVisible) { - this.trackVisible = trackVisible; - } - /** * Get base track point time interval * @return base track point time interval diff --git a/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java b/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java index 84fdab19..47e699b3 100644 --- a/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -1,208 +1,208 @@ -package seng302.Model; - -import org.geotools.referencing.GeodeticCalculator; -import seng302.Constants; -import seng302.Controllers.RaceController; -import seng302.GPSCoordinate; -import seng302.RaceDataSource; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - -/** - * Created by cbt24 on 6/03/17. - * - * @deprecated - */ -public class ConstantVelocityRace extends Race { - - private int dnfChance = 0; //%percentage chance a boat fails at each checkpoint - - /** - * Initialiser for a constant velocity race without standard data source - * - * @param startingBoats in race - * @param legs in race - * @param controller for graphics - * @param scaleFactor of timer - */ - public ConstantVelocityRace(List startingBoats, List legs, RaceController controller, int scaleFactor) { - super(startingBoats, legs, controller, scaleFactor); - } - - /** - * Initialiser for legacy tests - * - * @param startingBoats in race - * @param legs in race - * @param controller for graphics - * @param scaleFactor of timer - * - * @deprecated Please use {@link #ConstantVelocityRace(List, List, RaceController, int) } for future tests. - */ - public ConstantVelocityRace(BoatInRace[] startingBoats, List legs, RaceController controller, int scaleFactor) { - super(Arrays.asList(startingBoats), legs, controller, scaleFactor); - } - - /** - * Initialiser for constant velocity race with standard data source - * @param raceData for race - * @param controller for graphics - * @param scaleFactor of timer - */ - public ConstantVelocityRace(RaceDataSource raceData, RaceController controller, int scaleFactor) { - super(raceData, controller, scaleFactor); - } - - public void initialiseBoats() { - Leg officialStart = legs.get(0); - String name = officialStart.getName(); - Marker endMarker = officialStart.getEndMarker(); - - BoatInRace.setTrackPointTimeInterval(BoatInRace.getBaseTrackPointTimeInterval() / scaleFactor); - - ArrayList startMarkers = getSpreadStartingPositions(); - for (int i = 0; i < startingBoats.size(); i++) { - BoatInRace boat = startingBoats.get(i); - if (boat != null) { - boat.setScaledVelocity(boat.getVelocity() * scaleFactor); - Leg startLeg = new Leg(name, 0); - boat.setCurrentPosition(startMarkers.get(i).getAverageGPSCoordinate()); - startLeg.setStartMarker(startMarkers.get(i)); - startLeg.setEndMarker(endMarker); - startLeg.calculateDistance(); - boat.setCurrentLeg(startLeg); - boat.setHeading(boat.calculateHeading()); - } - } - } - - /** - * Creates a list of starting positions for the different boats, so they do not appear cramped at the start line - * - * @return list of starting positions - */ - public ArrayList getSpreadStartingPositions() { - - int nBoats = startingBoats.size(); - Marker marker = legs.get(0).getStartMarker(); - - GeodeticCalculator initialCalc = new GeodeticCalculator(); - initialCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); - initialCalc.setDestinationGeographicPoint(marker.getMark2().getLongitude(), marker.getMark2().getLatitude()); - - double azimuth = initialCalc.getAzimuth(); - double distanceBetweenMarkers = initialCalc.getOrthodromicDistance(); - double distanceBetweenBoats = distanceBetweenMarkers / (nBoats + 1); - - GeodeticCalculator positionCalc = new GeodeticCalculator(); - positionCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); - ArrayList positions = new ArrayList<>(); - - for (int i = 0; i < nBoats; i++) { - positionCalc.setDirection(azimuth, distanceBetweenBoats); - Point2D position = positionCalc.getDestinationGeographicPoint(); - positions.add(new Marker(new GPSCoordinate(position.getY(), position.getX()))); - - positionCalc = new GeodeticCalculator(); - positionCalc.setStartingGeographicPoint(position); - } - return positions; - } - - /** - * Sets the chance each boat has of failing at a gate or marker - * @param chance percentage chance a boat has of failing per checkpoint. - */ - protected void setDnfChance(int chance) { - if (chance >= 0 && chance <= 100) { - dnfChance = chance; - } - } - - protected boolean doNotFinish() { - Random rand = new Random(); - return rand.nextInt(100) < dnfChance; - } - - /** - * Calculates the distance a boat has travelled and updates its current position according to this value. - * - * @param boat to be updated - * @param millisecondsElapsed since last update - */ - protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { - - //distanceTravelled = velocity (nm p hr) * time taken to update loop - double distanceTravelled = (boat.getScaledVelocity() * millisecondsElapsed) / 3600000; - - double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); - - boolean finish = boat.getCurrentLeg().getName().equals("Finish"); - if (!finish) { - boat.setHeading(boat.calculateHeading()); - //update boat's distance travelled - boat.setDistanceTravelledInLeg(totalDistanceTravelled); - //Calculate boat's new position by adding the distance travelled onto the start point of the leg - boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartMarker().getAverageGPSCoordinate(), - totalDistanceTravelled, boat.calculateAzimuth())); - } - } - - protected void checkPosition(BoatInRace boat, long timeElapsed) { - if (boat.getDistanceTravelledInLeg() > boat.getCurrentLeg().getDistance()) { - //boat has passed onto new leg - if (boat.getCurrentLeg().getName().equals("Finish")) { - //boat has finished - boatsFinished++; - boat.setFinished(true); - boat.setTimeFinished(timeElapsed); - } else if (doNotFinish()) { - boatsFinished++; - boat.setFinished(true); - boat.setCurrentLeg(new Leg("DNF", -1)); - boat.setVelocity(0); - boat.setScaledVelocity(0); - } else { - //Calculate how much the boat overshot the marker by - boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); - //Move boat on to next leg - Leg nextLeg = legs.get(boat.getCurrentLeg().getLegNumber() + 1); - - boat.setCurrentLeg(nextLeg); - //Add overshoot distance into the distance travelled for the next leg - boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg()); - } - //Update the boat display table in the GUI to reflect the leg change - updatePositions(); - } - } - - /** - * Calculates the boats next GPS position based on its distance travelled and heading - * - * @param oldCoordinates GPS coordinates of the boat's starting position - * @param distanceTravelled distance in nautical miles - * @param azimuth boat's current direction. Value between -180 and 180 - * @return The boat's new coordinate - */ - public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { - - //Find new coordinate using current heading and distance - - GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); - //Load start point into calculator - Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); - geodeticCalculator.setStartingGeographicPoint(startPoint); - //load direction and distance tranvelled into calculator - geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); - //get new point - Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); - - return new GPSCoordinate(endPoint.getY(), endPoint.getX()); - } - -} \ No newline at end of file +//package seng302.Model; +// +//import org.geotools.referencing.GeodeticCalculator; +//import seng302.Constants; +//import seng302.Controllers.RaceController; +//import seng302.GPSCoordinate; +//import seng302.RaceDataSource; +// +//import java.awt.geom.Point2D; +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.List; +//import java.util.Random; +// +///** +// * Created by cbt24 on 6/03/17. +// * +// * @deprecated +// */ +//public class ConstantVelocityRace extends Race { +// +// private int dnfChance = 0; //%percentage chance a boat fails at each checkpoint +// +// /** +// * Initialiser for a constant velocity race without standard data source +// * +// * @param startingBoats in race +// * @param legs in race +// * @param controller for graphics +// * @param scaleFactor of timer +// */ +// public ConstantVelocityRace(List startingBoats, List legs, RaceController controller, int scaleFactor) { +// super(startingBoats, legs, controller, scaleFactor); +// } +// +// /** +// * Initialiser for legacy tests +// * +// * @param startingBoats in race +// * @param legs in race +// * @param controller for graphics +// * @param scaleFactor of timer +// * +// * @deprecated Please use {@link #ConstantVelocityRace(List, List, RaceController, int) } for future tests. +// */ +// public ConstantVelocityRace(BoatInRace[] startingBoats, List legs, RaceController controller, int scaleFactor) { +// super(Arrays.asList(startingBoats), legs, controller, scaleFactor); +// } +// +// /** +// * Initialiser for constant velocity race with standard data source +// * @param raceData for race +// * @param controller for graphics +// * @param scaleFactor of timer +// */ +// public ConstantVelocityRace(RaceDataSource raceData, RaceController controller, int scaleFactor) { +// super(raceData, controller, scaleFactor); +// } +// +// public void initialiseBoats() { +// Leg officialStart = legs.get(0); +// String name = officialStart.getName(); +// Marker endMarker = officialStart.getEndMarker(); +// +// BoatInRace.setTrackPointTimeInterval(BoatInRace.getBaseTrackPointTimeInterval() / scaleFactor); +// +// ArrayList startMarkers = getSpreadStartingPositions(); +// for (int i = 0; i < startingBoats.size(); i++) { +// BoatInRace boat = startingBoats.get(i); +// if (boat != null) { +// boat.setScaledVelocity(boat.getVelocity() * scaleFactor); +// Leg startLeg = new Leg(name, 0); +// boat.setCurrentPosition(startMarkers.get(i).getAverageGPSCoordinate()); +// startLeg.setStartMarker(startMarkers.get(i)); +// startLeg.setEndMarker(endMarker); +// startLeg.calculateDistance(); +// boat.setCurrentLeg(startLeg); +// boat.setHeading(boat.calculateHeading()); +// } +// } +// } +// +// /** +// * Creates a list of starting positions for the different boats, so they do not appear cramped at the start line +// * +// * @return list of starting positions +// */ +// public ArrayList getSpreadStartingPositions() { +// +// int nBoats = startingBoats.size(); +// Marker marker = legs.get(0).getStartMarker(); +// +// GeodeticCalculator initialCalc = new GeodeticCalculator(); +// initialCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); +// initialCalc.setDestinationGeographicPoint(marker.getMark2().getLongitude(), marker.getMark2().getLatitude()); +// +// double azimuth = initialCalc.getAzimuth(); +// double distanceBetweenMarkers = initialCalc.getOrthodromicDistance(); +// double distanceBetweenBoats = distanceBetweenMarkers / (nBoats + 1); +// +// GeodeticCalculator positionCalc = new GeodeticCalculator(); +// positionCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); +// ArrayList positions = new ArrayList<>(); +// +// for (int i = 0; i < nBoats; i++) { +// positionCalc.setDirection(azimuth, distanceBetweenBoats); +// Point2D position = positionCalc.getDestinationGeographicPoint(); +// positions.add(new Marker(new GPSCoordinate(position.getY(), position.getX()))); +// +// positionCalc = new GeodeticCalculator(); +// positionCalc.setStartingGeographicPoint(position); +// } +// return positions; +// } +// +// /** +// * Sets the chance each boat has of failing at a gate or marker +// * @param chance percentage chance a boat has of failing per checkpoint. +// */ +// protected void setDnfChance(int chance) { +// if (chance >= 0 && chance <= 100) { +// dnfChance = chance; +// } +// } +// +// protected boolean doNotFinish() { +// Random rand = new Random(); +// return rand.nextInt(100) < dnfChance; +// } +// +// /** +// * Calculates the distance a boat has travelled and updates its current position according to this value. +// * +// * @param boat to be updated +// * @param millisecondsElapsed since last update +// */ +// protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { +// +// //distanceTravelled = velocity (nm p hr) * time taken to update loop +// double distanceTravelled = (boat.getScaledVelocity() * millisecondsElapsed) / 3600000; +// +// double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); +// +// boolean finish = boat.getCurrentLeg().getName().equals("Finish"); +// if (!finish) { +// boat.setHeading(boat.calculateHeading()); +// //update boat's distance travelled +// boat.setDistanceTravelledInLeg(totalDistanceTravelled); +// //Calculate boat's new position by adding the distance travelled onto the start point of the leg +// boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartMarker().getAverageGPSCoordinate(), +// totalDistanceTravelled, boat.calculateAzimuth())); +// } +// } +// +// protected void checkPosition(BoatInRace boat, long timeElapsed) { +// if (boat.getDistanceTravelledInLeg() > boat.getCurrentLeg().getDistance()) { +// //boat has passed onto new leg +// if (boat.getCurrentLeg().getName().equals("Finish")) { +// //boat has finished +// boatsFinished++; +// boat.setFinished(true); +// boat.setTimeFinished(timeElapsed); +// } else if (doNotFinish()) { +// boatsFinished++; +// boat.setFinished(true); +// boat.setCurrentLeg(new Leg("DNF", -1)); +// boat.setVelocity(0); +// boat.setScaledVelocity(0); +// } else { +// //Calculate how much the boat overshot the marker by +// boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); +// //Move boat on to next leg +// Leg nextLeg = legs.get(boat.getCurrentLeg().getLegNumber() + 1); +// +// boat.setCurrentLeg(nextLeg); +// //Add overshoot distance into the distance travelled for the next leg +// boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg()); +// } +// //Update the boat display table in the GUI to reflect the leg change +// updatePositions(); +// } +// } +// +// /** +// * Calculates the boats next GPS position based on its distance travelled and heading +// * +// * @param oldCoordinates GPS coordinates of the boat's starting position +// * @param distanceTravelled distance in nautical miles +// * @param azimuth boat's current direction. Value between -180 and 180 +// * @return The boat's new coordinate +// */ +// public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { +// +// //Find new coordinate using current heading and distance +// +// GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); +// //Load start point into calculator +// Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); +// geodeticCalculator.setStartingGeographicPoint(startPoint); +// //load direction and distance tranvelled into calculator +// geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); +// //get new point +// Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); +// +// return new GPSCoordinate(endPoint.getY(), endPoint.getX()); +// } +// +//} \ No newline at end of file diff --git a/visualiser/src/main/java/seng302/Model/Race.java b/visualiser/src/main/java/seng302/Model/Race.java index c033c8a3..ed36fc92 100644 --- a/visualiser/src/main/java/seng302/Model/Race.java +++ b/visualiser/src/main/java/seng302/Model/Race.java @@ -21,8 +21,8 @@ import java.util.Random; * Created by fwy13 on 3/03/17. */ public abstract class Race implements Runnable { - //protected BoatInRace[] startingBoats; - protected ObservableList startingBoats; + //protected Boat[] startingBoats; + protected ObservableList startingBoats; protected List legs; protected RaceController controller; protected int boatsFinished = 0; @@ -42,7 +42,7 @@ public abstract class Race implements Runnable { * @param controller race controller * @param scaleFactor for race */ - public Race(List boats, List legs, RaceController controller, int scaleFactor) { + public Race(List boats, List legs, RaceController controller, int scaleFactor) { this.startingBoats = FXCollections.observableArrayList(boats); this.legs = legs; @@ -54,14 +54,21 @@ public abstract class Race implements Runnable { } } - public Race(BoatInRace[] startingBoats, List legs, RaceController controller, int scaleFactor) { - this(Arrays.asList(startingBoats), legs, controller, scaleFactor); - } - public Race(RaceDataSource raceData, RaceController controller, int scaleFactor) { this(raceData.getBoats(), raceData.getLegs(), controller, scaleFactor); } + /** + * @deprecated + * @param startingBoats + * @param legs + * @param controller + * @param scaleFactor + */ + public Race(Boat[] startingBoats, List legs, RaceController controller, int scaleFactor) { + this(Arrays.asList(startingBoats), legs, controller, scaleFactor); + } + public abstract void initialiseBoats(); /** @@ -75,9 +82,9 @@ public abstract class Race implements Runnable { * * @param boat Boat that the postion is to be updated for. * @param timeElapsed Time that has elapse since the start of the the race. - * @see BoatInRace + * @see Boat */ - protected abstract void checkPosition(BoatInRace boat, long timeElapsed); + protected abstract void checkPosition(Boat boat, long timeElapsed); /** * Updates the boat's gps coordinates @@ -85,7 +92,7 @@ public abstract class Race implements Runnable { * @param boat to be updated * @param millisecondsElapsed time since last update */ - protected abstract void updatePosition(BoatInRace boat, int millisecondsElapsed); + protected abstract void updatePosition(Boat boat, int millisecondsElapsed); /** * Runnable for the thread. @@ -189,7 +196,7 @@ public abstract class Race implements Runnable { System.setProperty("javafx.animation.fullspeed", "true"); - for (BoatInRace boat : startingBoats) { + for (Boat boat : startingBoats) { boat.setStarted(true); } @@ -205,7 +212,7 @@ public abstract class Race implements Runnable { if (boatsFinished < startingBoats.size()) { totalTimeElapsed = System.currentTimeMillis() - timeRaceStarted; - for (BoatInRace boat : startingBoats) { + for (Boat boat : startingBoats) { if (boat != null && !boat.isFinished()) { boat.addTrackPoint(boat.getCurrentPosition()); updatePosition(boat, Math.round(1000 / lastFPS) > 20 ? 15 : Math.round(1000 / lastFPS)); @@ -234,7 +241,7 @@ public abstract class Race implements Runnable { */ protected void updatePositions() { FXCollections.sort(startingBoats, (a, b) -> b.getCurrentLeg().getLegNumber() - a.getCurrentLeg().getLegNumber()); - for(BoatInRace boat: startingBoats) { + for(Boat boat: startingBoats) { if(boat != null) { boat.setPosition(Integer.toString(startingBoats.indexOf(boat) + 1)); if (boat.getCurrentLeg().getName().equals("DNF") || boat.getCurrentLeg().getLegNumber() == 0) @@ -253,11 +260,11 @@ public abstract class Race implements Runnable { /** * Returns the boats that have started the race. * - * @return ObservableList of BoatInRace class that participated in the race. + * @return ObservableList of Boat class that participated in the race. * @see ObservableList - * @see BoatInRace + * @see Boat */ - public ObservableList getStartingBoats() { + public ObservableList getStartingBoats() { return startingBoats; } } diff --git a/visualiser/src/main/java/seng302/Model/RaceClock.java b/visualiser/src/main/java/seng302/Model/RaceClock.java index c4ce751d..43013f7b 100644 --- a/visualiser/src/main/java/seng302/Model/RaceClock.java +++ b/visualiser/src/main/java/seng302/Model/RaceClock.java @@ -57,6 +57,7 @@ public class RaceClock { } public String getTimeZone() { + System.out.println(zoneId.toString()); return zoneId.toString(); } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index 66ccb518..dc062c20 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -21,12 +21,13 @@ import java.util.List; public class ResizableRaceCanvas extends Canvas { private GraphicsContext gc; private RaceMap map; - private List boats; + private List boats; private boolean raceAnno = true; private boolean annoName = true; private boolean annoAbbrev = true; private boolean annoSpeed = true; private boolean annoPath = true; + private List colours; private List raceBoundaries; private List markers; double[] xpoints = {}, ypoints = {}; @@ -46,6 +47,7 @@ public class ResizableRaceCanvas extends Canvas { this.raceBoundaries = raceData.getBoundary(); this.markers = raceData.getMarkers(); + makeColours(); } /** @@ -53,7 +55,7 @@ public class ResizableRaceCanvas extends Canvas { * * @param boats in race */ - public void setBoats(List boats) { + public void setBoats(List boats) { this.boats = boats; } @@ -81,9 +83,9 @@ public class ResizableRaceCanvas extends Canvas { gc.fillOval(graphCoordinate.getX() - (d / 2), graphCoordinate.getY() - (d / 2), d, d); } - public void displayBoat(BoatInRace boat, double angle) { + public void displayBoat(Boat boat, double angle, Color colour) { GraphCoordinate pos = this.map.convertGPS(boat.getCurrentPosition()); - Paint paint = boat.getColour(); + Paint paint = colour; double[] x = {pos.getX() - 6, pos.getX(), pos.getX() + 6}; double[] y = {pos.getY() + 12, pos.getY() - 12, pos.getY() + 12}; @@ -322,27 +324,29 @@ public class ResizableRaceCanvas extends Canvas { * Draws boats while race in progress, when leg heading is set. */ public void updateBoats() { + int currentColour = 0; // TODO Remove null when boats are ready boats = null; if (boats != null) { - for (BoatInRace boat : boats) { + for (Boat boat : boats) { boolean finished = boat.getCurrentLeg().getName().equals("Finish") || boat.getCurrentLeg().getName().equals("DNF"); boolean isStart = boat.isStarted(); if (!finished && isStart) { - displayBoat(boat, boat.getHeading()); + displayBoat(boat, boat.getHeading(), colours.get(currentColour)); GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition()); GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake()); - displayLine(wakeFrom, wakeTo, boat.getColour()); + displayLine(wakeFrom, wakeTo, colours.get(currentColour)); } else if (!isStart) { - displayBoat(boat, boat.getHeading()); + displayBoat(boat, boat.getHeading(), colours.get(currentColour)); } else { - displayBoat(boat, 0); + displayBoat(boat, 0, colours.get(currentColour)); } if (raceAnno) displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition())); - if(boat.isTrackVisible()) drawTrack(boat); + drawTrack(boat, colours.get(currentColour)); + currentColour = (currentColour + 1) % colours.size(); } } } @@ -352,11 +356,11 @@ public class ResizableRaceCanvas extends Canvas { * @param boat whose track is displayed * @see seng302.Model.TrackPoint */ - private void drawTrack(BoatInRace boat) { + private void drawTrack(Boat boat, Color colour) { if (annoPath && raceAnno) { for (TrackPoint point : boat.getTrack()) { GraphCoordinate scaledCoordinate = this.map.convertGPS(point.getCoordinate()); - Color boatColour = boat.getColour(); + Color boatColour = colour; gc.setFill(new Color(boatColour.getRed(), boatColour.getGreen(), boatColour.getBlue(), point.getAlpha())); gc.fillOval(scaledCoordinate.getX(), scaledCoordinate.getY(), 5, 5); } @@ -381,6 +385,20 @@ public class ResizableRaceCanvas extends Canvas { } } + private void makeColours() { + colours = new ArrayList(Arrays.asList( + Color.BLUEVIOLET, + Color.BLACK, + Color.RED, + Color.ORANGE, + Color.DARKOLIVEGREEN, + Color.LIMEGREEN, + Color.PURPLE, + Color.DARKGRAY, + Color.YELLOW + )); + } + /** * Set the Canvas to resizable. * diff --git a/visualiser/src/main/java/seng302/RaceDataSource.java b/visualiser/src/main/java/seng302/RaceDataSource.java index c309661b..8d6a1d1c 100644 --- a/visualiser/src/main/java/seng302/RaceDataSource.java +++ b/visualiser/src/main/java/seng302/RaceDataSource.java @@ -1,5 +1,6 @@ package seng302; +import seng302.Model.Boat; import seng302.Model.BoatInRace; import seng302.Model.Leg; import seng302.Model.Marker; @@ -11,7 +12,7 @@ import java.util.List; * Created by connortaylorbrown on 19/04/17. */ public interface RaceDataSource { - List getBoats(); + List getBoats(); List getLegs(); List getMarkers(); List getBoundary(); diff --git a/visualiser/src/main/java/seng302/RaceXMLReader.java b/visualiser/src/main/java/seng302/RaceXMLReader.java index a3b0dfeb..8be2b022 100644 --- a/visualiser/src/main/java/seng302/RaceXMLReader.java +++ b/visualiser/src/main/java/seng302/RaceXMLReader.java @@ -17,7 +17,7 @@ import java.util.List; * @deprecated use {@link seng302.Mock.StreamedCourseXMLReader} */ public class RaceXMLReader extends XMLReader implements RaceDataSource { - private List boats = new ArrayList<>(); + private List boats = new ArrayList<>(); private Color[] colors = {Color.BLUEVIOLET, Color.BLACK, Color.RED, Color.ORANGE, Color.DARKOLIVEGREEN, Color.LIMEGREEN};//TODO make this established in xml or come up with a better system. private List legs = new ArrayList<>(); private GPSCoordinate mark, startPt1, startPt2, finishPt1, finishPt2, leewardPt1, leewardPt2, windwardPt1, windwardPt2; @@ -269,7 +269,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { return null; } - public List getBoats() { + public List getBoats() { return boats; } diff --git a/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java b/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java index 76b1953d..3094dad4 100644 --- a/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java +++ b/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java @@ -1,140 +1,140 @@ -package seng302.Model; - - -import javafx.scene.paint.Color; -import org.geotools.referencing.GeodeticCalculator; -import org.junit.Test; -import seng302.Constants; -import seng302.GPSCoordinate; - -import java.lang.reflect.Array; -import java.util.ArrayList; - -import static org.junit.Assert.assertEquals; - -/** - * Created by esa46 on 16/03/17. - */ -public class ConstantVelocityRaceTest { - - Marker START_MARKER = new Marker(new GPSCoordinate(0, 0)); - Marker END_MARKER = new Marker(new GPSCoordinate(10, 10)); - Leg START_LEG = new Leg("Start", START_MARKER, END_MARKER, 0); - - int ONE_HOUR = 3600000; //1 hour in milliseconds - - - private ArrayList generateLegsArray() { - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - return legs; - } - - @Test - public void updatePositionChangesDistanceTravelled() { - ArrayList legs = generateLegsArray(); - BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); - boat.setCurrentLeg(legs.get(0)); - boat.setDistanceTravelledInLeg(0); - BoatInRace[] boats = new BoatInRace[]{boat}; - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); - - race.updatePosition(boat, ONE_HOUR); - assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity(), 1e-8); - } - - - @Test - public void updatePositionHandlesNoChangeToDistanceTravelled() { - - ArrayList legs = generateLegsArray(); - BoatInRace boat = new BoatInRace("Test", 0, Color.ALICEBLUE, "tt"); - boat.setCurrentLeg(legs.get(0)); - boat.setDistanceTravelledInLeg(0); - BoatInRace[] boats = new BoatInRace[]{boat}; - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); - - race.updatePosition(boat, ONE_HOUR); - assertEquals(boat.getDistanceTravelledInLeg(), 0, 1e-8); - } - - @Test - public void changesToDistanceTravelledAreAdditive() { - - ArrayList legs = generateLegsArray(); - BoatInRace boat = new BoatInRace("Test", 5, Color.ALICEBLUE, "tt"); - boat.setCurrentLeg(legs.get(0)); - boat.setDistanceTravelledInLeg(50); - BoatInRace[] boats = new BoatInRace[]{boat}; - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); - - race.updatePosition(boat, ONE_HOUR); - assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity() + 50, 1e-8); - } - - @Test - public void travelling10nmNorthGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 0); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(0, 10 * Constants.NMToMetersConversion); - - assertEquals(newPos.getLongitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - - - @Test - public void travelling10nmEastGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 90); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(90, 10 * Constants.NMToMetersConversion); - - - assertEquals(newPos.getLatitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - - - @Test - public void travelling10nmWestGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, -90); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(-90, 10 * Constants.NMToMetersConversion); - - - assertEquals(newPos.getLatitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - - - @Test - public void travelling10nmSouthGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 180); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(180, 10 * Constants.NMToMetersConversion); - - - assertEquals(newPos.getLongitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - -} +//package seng302.Model; +// +// +//import javafx.scene.paint.Color; +//import org.geotools.referencing.GeodeticCalculator; +//import org.junit.Test; +//import seng302.Constants; +//import seng302.GPSCoordinate; +// +//import java.lang.reflect.Array; +//import java.util.ArrayList; +// +//import static org.junit.Assert.assertEquals; +// +///** +// * Created by esa46 on 16/03/17. +// */ +//public class ConstantVelocityRaceTest { +// +// Marker START_MARKER = new Marker(new GPSCoordinate(0, 0)); +// Marker END_MARKER = new Marker(new GPSCoordinate(10, 10)); +// Leg START_LEG = new Leg("Start", START_MARKER, END_MARKER, 0); +// +// int ONE_HOUR = 3600000; //1 hour in milliseconds +// +// +// private ArrayList generateLegsArray() { +// ArrayList legs = new ArrayList<>(); +// legs.add(START_LEG); +// return legs; +// } +// +// @Test +// public void updatePositionChangesDistanceTravelled() { +// ArrayList legs = generateLegsArray(); +// BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); +// boat.setCurrentLeg(legs.get(0)); +// boat.setDistanceTravelledInLeg(0); +// BoatInRace[] boats = new BoatInRace[]{boat}; +// +// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); +// +// race.updatePosition(boat, ONE_HOUR); +// assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity(), 1e-8); +// } +// +// +// @Test +// public void updatePositionHandlesNoChangeToDistanceTravelled() { +// +// ArrayList legs = generateLegsArray(); +// BoatInRace boat = new BoatInRace("Test", 0, Color.ALICEBLUE, "tt"); +// boat.setCurrentLeg(legs.get(0)); +// boat.setDistanceTravelledInLeg(0); +// BoatInRace[] boats = new BoatInRace[]{boat}; +// +// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); +// +// race.updatePosition(boat, ONE_HOUR); +// assertEquals(boat.getDistanceTravelledInLeg(), 0, 1e-8); +// } +// +// @Test +// public void changesToDistanceTravelledAreAdditive() { +// +// ArrayList legs = generateLegsArray(); +// BoatInRace boat = new BoatInRace("Test", 5, Color.ALICEBLUE, "tt"); +// boat.setCurrentLeg(legs.get(0)); +// boat.setDistanceTravelledInLeg(50); +// BoatInRace[] boats = new BoatInRace[]{boat}; +// +// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); +// +// race.updatePosition(boat, ONE_HOUR); +// assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity() + 50, 1e-8); +// } +// +// @Test +// public void travelling10nmNorthGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 0); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(0, 10 * Constants.NMToMetersConversion); +// +// assertEquals(newPos.getLongitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +// +// @Test +// public void travelling10nmEastGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 90); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(90, 10 * Constants.NMToMetersConversion); +// +// +// assertEquals(newPos.getLatitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +// +// @Test +// public void travelling10nmWestGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, -90); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(-90, 10 * Constants.NMToMetersConversion); +// +// +// assertEquals(newPos.getLatitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +// +// @Test +// public void travelling10nmSouthGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 180); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(180, 10 * Constants.NMToMetersConversion); +// +// +// assertEquals(newPos.getLongitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +//} diff --git a/visualiser/src/test/java/seng302/Model/RaceXMLTest.java b/visualiser/src/test/java/seng302/Model/RaceXMLTest.java index 618f2ff4..449c435f 100644 --- a/visualiser/src/test/java/seng302/Model/RaceXMLTest.java +++ b/visualiser/src/test/java/seng302/Model/RaceXMLTest.java @@ -30,7 +30,7 @@ public class RaceXMLTest { try { RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); raceXMLReader.readBoats(); - List boats = raceXMLReader.getBoats(); + List boats = raceXMLReader.getBoats(); assertTrue(boats.size() == 6); //test boat 1 assertEquals(boats.get(0).getName().getValue(), "ORACLE TEAM USA"); From 39d3cc7c2850c0a4ca4378615b0124a4db568892 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Fri, 28 Apr 2017 12:44:53 +1200 Subject: [PATCH 3/3] Removed boats being able to store colour, this is now down the in the ResizableRaceCanvas. #refactor #story[782] --- .../main/java/seng302/Mock/BoatXMLReader.java | 23 ++----------------- .../main/java/seng302/Mock/StreamedBoat.java | 2 +- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java index 386eb3fa..9a614faa 100644 --- a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java @@ -20,8 +20,6 @@ import java.util.*; public class BoatXMLReader extends XMLReader { Map streamedBoatMap = new HashMap<>(); Map participants = new HashMap<>(); - private List colours; - private static int currentColourIndex = 0; /** * Constructor for Boat XML Reader @@ -32,7 +30,6 @@ public class BoatXMLReader extends XMLReader { */ public BoatXMLReader(String filePath) throws IOException, SAXException, ParserConfigurationException, ParseException { this(filePath, false); - makeColours(); } /** @@ -45,7 +42,6 @@ public class BoatXMLReader extends XMLReader { */ public BoatXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException { super(filePath); - makeColours(); if (read) { read(); } @@ -82,7 +78,6 @@ public class BoatXMLReader extends XMLReader { Node boat = nBoats.getChildNodes().item(i); if (boat.getNodeName().equals("Boat")) { readSingleBoat(boat); - currentColourIndex = (currentColourIndex + 1) % colours.size(); } } } @@ -109,9 +104,9 @@ public class BoatXMLReader extends XMLReader { if (!streamedBoatMap.containsKey(sourceID)) { if (country != null) { - streamedBoat = new StreamedBoat(sourceID, boatName, colours.get(currentColourIndex), country); + streamedBoat = new StreamedBoat(sourceID, boatName, country); } else { - streamedBoat = new StreamedBoat(sourceID, boatName, colours.get(currentColourIndex), shortName); + streamedBoat = new StreamedBoat(sourceID, boatName, shortName); } streamedBoatMap.put(sourceID, streamedBoat); // Override boat with new boat @@ -133,20 +128,6 @@ public class BoatXMLReader extends XMLReader { // TODO Get relative point before implementing. (GPSposition is based off a relative point). } - private void makeColours() { - colours = new ArrayList(Arrays.asList( - Color.BLUEVIOLET, - Color.BLACK, - Color.RED, - Color.ORANGE, - Color.DARKOLIVEGREEN, - Color.LIMEGREEN, - Color.PURPLE, - Color.DARKGRAY, - Color.YELLOW - )); - } - public void setParticipants(Map participants) { this.participants = participants; } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index 88b025be..19b27c9f 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -19,7 +19,7 @@ public class StreamedBoat extends Boat { this.velocity = 0; } - public StreamedBoat(int sourceID, String name, Color colour, String abbrev) { + public StreamedBoat(int sourceID, String name, String abbrev) { super(name, abbrev); this.sourceID = sourceID; this.init();