From 192178760ed95c7c003d11031c9969e0e3ed2c03 Mon Sep 17 00:00:00 2001 From: Erika Date: Sun, 19 Mar 2017 14:12:28 +1300 Subject: [PATCH] Boat moves between legs and finishes - Have hard coded in first two legs -Possibly found problem with lat and longitude coordinate system being switched #story[9] --- src/main/java/seng302/Constants.java | 23 +++++++++++++++++++ .../seng302/Controllers/RaceController.java | 15 +++++------- .../seng302/Model/ConstantVelocityRace.java | 21 +++++++++++++---- src/main/java/seng302/Model/Leg.java | 20 ++++++++++------ src/main/java/seng302/Model/Race.java | 6 ++--- .../seng302/Model/ResizableRaceCanvas.java | 20 ++++++++-------- .../Model/ConstantVelocityRaceTest.java | 7 ++++-- src/test/java/seng302/Model/RaceTest.java | 2 +- 8 files changed, 78 insertions(+), 36 deletions(-) create mode 100644 src/main/java/seng302/Constants.java diff --git a/src/main/java/seng302/Constants.java b/src/main/java/seng302/Constants.java new file mode 100644 index 00000000..fcae681f --- /dev/null +++ b/src/main/java/seng302/Constants.java @@ -0,0 +1,23 @@ +package seng302; + +import seng302.Model.Leg; + +/** + * Created by Erika on 19-Mar-17. + */ +public class Constants { + + public static final int NMToMetersConversion = 1852; //nautical miles + + public static final GPSCoordinate startLineMarker1 = new GPSCoordinate(32.296577, -64.854304); + public static final GPSCoordinate startLineMarker2 = new GPSCoordinate(32.293771, -64.855242); + + public static final GPSCoordinate mark1 = new GPSCoordinate(32.293039, -64.843983); + + public static final GPSCoordinate leewardGate1 = new GPSCoordinate(32.284680, -64.850045); + public static final GPSCoordinate leewardGate2 = new GPSCoordinate(32.280164, -64.847591); + public static final GPSCoordinate windwardGate1 = new GPSCoordinate(32.309693, -64.835249); + public static final GPSCoordinate windwardGate2 = new GPSCoordinate(32.308046, -64.831785); + + //public static final Leg bermudaCourseStartToMark1 = new Leg(0, , new ) +} diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index 87c28675..a2dbf45b 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -13,11 +13,13 @@ import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.util.Callback; import org.geotools.referencing.GeodeticCalculator; +import seng302.Constants; import seng302.GPSCoordinate; import seng302.Model.ResizableRaceCanvas; import seng302.Model.*; import seng302.RaceMap; +import java.awt.geom.Point2D; import java.net.URL; import java.util.ArrayList; import java.util.ResourceBundle; @@ -68,7 +70,7 @@ public class RaceController extends Controller{ @Override public void initialize(URL location, ResourceBundle resources) { - BoatInRace boat = new BoatInRace("NZ", 100); + BoatInRace boat = new BoatInRace("NZ", 400); boat.setColour(Color.DARKVIOLET); boat.setCurrentPosition(new GPSCoordinate(0, 0)); BoatInRace[] boats = new BoatInRace[] {boat}; @@ -90,14 +92,9 @@ public class RaceController extends Controller{ private ArrayList bermudaCourseLegs() { ArrayList legs = new ArrayList<>(); - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(32.296577, -64.854304); - calc.setDestinationGeographicPoint(32.293039, -64.843983); - double distance = calc.getOrthodromicDistance(); - Leg leg1 = new Leg("Start to Mark 1", distance, new GPSCoordinate(32.296577, -64.854304), - new GPSCoordinate(32.293039, -64.843983), 0); - - legs.add(leg1); + Leg leg1 = new Leg("Start to Mark 1", Constants.startLineMarker1, Constants.mark1, 0); + Leg leg2 = new Leg("Mark 1 to Leeward Gate", Constants.mark1, Constants.leewardGate1, 1); + legs.add(leg1); legs.add(leg2); return legs; } diff --git a/src/main/java/seng302/Model/ConstantVelocityRace.java b/src/main/java/seng302/Model/ConstantVelocityRace.java index b6472dfe..281724ef 100644 --- a/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -1,5 +1,6 @@ package seng302.Model; +import seng302.Constants; import seng302.Controllers.RaceController; @@ -36,13 +37,23 @@ public class ConstantVelocityRace extends Race { double distanceTravelled = boat.getVelocity() * millisecondsElapsed/3600000; double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); - boat.setDistanceTravelledInLeg(totalDistanceTravelled); - boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartGraphCoordinate(), - totalDistanceTravelled, boat.calculateHeading())); + if (!boat.getCurrentLeg().getName().equals("Finish")) { + + boat.setDistanceTravelledInLeg(totalDistanceTravelled); + boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartGraphCoordinate(), + totalDistanceTravelled, boat.calculateHeading())); + } } - public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double 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 + */ + public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { //Find new coordinate using current heading and distance @@ -51,7 +62,7 @@ public class ConstantVelocityRace extends Race { Point2D startPoint = new Point2D.Double(oldCoordinates.getLatitude(), oldCoordinates.getLongitude()); geodeticCalculator.setStartingGeographicPoint(startPoint); - geodeticCalculator.setDirection(heading, distanceTravelled * 1852); + geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); diff --git a/src/main/java/seng302/Model/Leg.java b/src/main/java/seng302/Model/Leg.java index 67557ab8..fdab9343 100644 --- a/src/main/java/seng302/Model/Leg.java +++ b/src/main/java/seng302/Model/Leg.java @@ -1,5 +1,8 @@ package seng302.Model; +import org.geotools.referencing.Console; +import org.geotools.referencing.GeodeticCalculator; +import seng302.Constants; import seng302.GPSCoordinate; import seng302.GraphCoordinate; @@ -18,22 +21,17 @@ public class Leg { /** * Leg Initialiser * @param name Name of the Leg - * @param distance Total Distance located in the Race */ - public Leg(String name, double distance, GPSCoordinate start, GPSCoordinate end, int number) { + public Leg(String name, GPSCoordinate start, GPSCoordinate end, int number) { this.name = name; - this.distance = distance; this.startGPSCoordinate = start; this.endGPSCoordinate = end; this.legNumber = number; + this.distance = calculateDistance(); } public Leg(String name) { this.name = name; - this.distance = 0; - this.startGPSCoordinate = new GPSCoordinate(0,0); - this.endGPSCoordinate = new GPSCoordinate(0,0); - this.legNumber = 0; } /** @@ -80,4 +78,12 @@ public class Leg { public int getLegNumber() { return legNumber; } + + private double calculateDistance() { + + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint(startGPSCoordinate.getLatitude(), startGPSCoordinate.getLongitude()); + calc.setDestinationGeographicPoint(endGPSCoordinate.getLatitude(), endGPSCoordinate.getLongitude()); + return calc.getOrthodromicDistance() / Constants.NMToMetersConversion; + } } diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index 22e0e7ef..d8c89d79 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -22,11 +22,11 @@ public abstract class Race implements Runnable { /** * Initailiser for Race * @param boats Takes in an array of boats that are participating in the race. - * @param marks Number of marks in order that the boats pass in order to complete the race. + * @param legs Number of marks in order that the boats pass in order to complete the race. */ - public Race(BoatInRace[] boats, ArrayList marks, RaceController controller) { + public Race(BoatInRace[] boats, ArrayList legs, RaceController controller) { this.startingBoats = boats; - this.legs = marks; + this.legs = legs; this.legs.add(new Leg("Finish")); this.controller = controller; } diff --git a/src/main/java/seng302/Model/ResizableRaceCanvas.java b/src/main/java/seng302/Model/ResizableRaceCanvas.java index 93b72581..2dde9651 100644 --- a/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -1,10 +1,12 @@ package seng302.Model; +import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.transform.Rotate; +import seng302.Constants; import seng302.GPSCoordinate; import seng302.GraphCoordinate; import seng302.RaceMap; @@ -92,17 +94,17 @@ public class ResizableRaceCanvas extends Canvas { GraphCoordinate finishLineCoord2 = this.map.convertGPS(32.317257, -64.836260); displayLine(finishLineCoord1, finishLineCoord2, Color.DARKRED); //marks - GraphCoordinate markCoord = this.map.convertGPS(32.293039, -64.843983); - GraphCoordinate southGate1 = this.map.convertGPS(32.284680, -64.850045); - GraphCoordinate southGate2 = this.map.convertGPS(32.280164, -64.847591); - GraphCoordinate northGate1 = this.map.convertGPS(32.309693, -64.835249); - GraphCoordinate northGate2 = this.map.convertGPS(32.308046, -64.831785); + 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(southGate1, southGate2, Color.DARKCYAN); - displayLine(northGate1, northGate2, Color.DARKVIOLET); + displayLine(windwardGate1, windwardGate2, Color.DARKCYAN); + displayLine(leewardGate1, leewardGate2, Color.DARKVIOLET); //start line - GraphCoordinate startline1 = this.map.convertGPS(32.296577, -64.854304); - GraphCoordinate startline2 = this.map.convertGPS(32.293771, -64.855242); + GraphCoordinate startline1 = this.map.convertGPS(Constants.startLineMarker1); + GraphCoordinate startline2 = this.map.convertGPS(Constants.startLineMarker2); displayLine(startline1, startline2, Color.GREEN); diff --git a/src/test/java/seng302/Model/ConstantVelocityRaceTest.java b/src/test/java/seng302/Model/ConstantVelocityRaceTest.java index 8701d988..ab249ef9 100644 --- a/src/test/java/seng302/Model/ConstantVelocityRaceTest.java +++ b/src/test/java/seng302/Model/ConstantVelocityRaceTest.java @@ -4,6 +4,8 @@ package seng302.Model; import org.junit.Test; import seng302.GPSCoordinate; +import static org.junit.Assert.assertEquals; + /** * Created by esa46 on 16/03/17. */ @@ -12,7 +14,8 @@ public class ConstantVelocityRaceTest { @Test public void travelling5nmNorthGivesCorrectNewCoordinates() { GPSCoordinate oldPos = new GPSCoordinate(0, 0); - System.out.println(ConstantVelocityRace.calculatePosition(oldPos, 18520, 90).getLatitude()); - System.out.println(ConstantVelocityRace.calculatePosition(oldPos, 18520, 90).getLongitude()); + System.out.println(ConstantVelocityRace.calculatePosition(oldPos, 5, 0).getLatitude()); +// assertEquals(ConstantVelocityRace.calculatePosition(oldPos, 5, 90).getLatitude(), 0.08, 1e-1); + System.out.println(ConstantVelocityRace.calculatePosition(oldPos, 5, 0).getLongitude()); } } diff --git a/src/test/java/seng302/Model/RaceTest.java b/src/test/java/seng302/Model/RaceTest.java index 0d13c888..d7890f73 100644 --- a/src/test/java/seng302/Model/RaceTest.java +++ b/src/test/java/seng302/Model/RaceTest.java @@ -22,7 +22,7 @@ public class RaceTest { BoatInRace boat = new BoatInRace("NZ", 240); BoatInRace[] boats = new BoatInRace[] {boat}; ArrayList legs = new ArrayList<>(); - legs.add(new Leg("Start", 1, new GPSCoordinate(0,0), new GPSCoordinate(1,1), 0)); + legs.add(new Leg("Start", new GPSCoordinate(0,0), new GPSCoordinate(1,1), 0)); ConstantVelocityRace race = new ConstantVelocityRace(boats, legs); race.run(); }