diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index 5a85a0d4..47bee639 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -42,11 +42,9 @@ public class Boat { * * @return the direction that the boat is heading towards in degrees (-180 to 180). */ - public double calculateAzimuth() { + public double calculateAzimuth(GPSCoordinate start, GPSCoordinate end) { GeodeticCalculator calc = new GeodeticCalculator(); - GPSCoordinate start = currentLeg.getStartMarker().getAverageGPSCoordinate(); - GPSCoordinate end = currentLeg.getEndMarker().getAverageGPSCoordinate(); calc.setStartingGeographicPoint(start.getLongitude(), start.getLatitude()); calc.setDestinationGeographicPoint(end.getLongitude(), end.getLatitude()); @@ -59,7 +57,23 @@ public class Boat { * @return The azimuth value which is greater than 0 */ public double calculateHeading() { - double azimuth = this.calculateAzimuth(); + double azimuth = this.calculateAzimuth(currentLeg.getStartMarker().getAverageGPSCoordinate(), + currentLeg.getEndMarker().getAverageGPSCoordinate()); + + if (azimuth >= 0) { + return azimuth; + } else { + return azimuth + 360; + } + } + + /** + * Calculate the heding depending on the calculated azimuth value + * @return The azimuth value which is greater than 0 + */ + public double calculateBearingToDestination() { + double azimuth = this.calculateAzimuth(this.currentPosition, + currentLeg.getEndMarker().getAverageGPSCoordinate()); if (azimuth >= 0) { return azimuth; diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index d4e92480..316cc131 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -41,6 +41,7 @@ public class Race implements Runnable { private MockOutput mockOutput; private static int boatOffset = 0; private int finished = 0; + private List boundary; /** @@ -50,7 +51,7 @@ public class Race implements Runnable { * @param legs Number of marks in order that the boats pass in order to complete the race. * @param scaleFactor for race */ - public Race(List boats, List legs, int raceID, int scaleFactor, MockOutput mockOutput) { + public Race(List boats, List legs, int raceID, int scaleFactor, MockOutput mockOutput, List boundary) { this.startingBoats = FXCollections.observableArrayList(boats); this.legs = legs; @@ -58,6 +59,7 @@ public class Race implements Runnable { this.raceId = raceID; this.scaleFactor = scaleFactor; this.mockOutput = mockOutput; + this.boundary = boundary; //TODO refactor this.startTime = System.currentTimeMillis() + (this.PRERACE_TIME / this.scaleFactor); @@ -69,7 +71,7 @@ public class Race implements Runnable { } public Race(RaceDataSource raceData, int scaleFactor, MockOutput mockOutput) { - this(raceData.getBoats(), raceData.getLegs(), raceData.getRaceId(), scaleFactor, mockOutput); + this(raceData.getBoats(), raceData.getLegs(), raceData.getRaceId(), scaleFactor, mockOutput, raceData.getBoundary()); } /** @@ -298,12 +300,21 @@ public class Race implements Runnable { 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())); + if(!GPSCoordinate.isInsideBoundary(boat.getCurrentPosition(), this.boundary)){ +//todo - find the acceptable values for direction + } else{ + VMG newHeading = boat.getPolars().calculateVMG(180, 30, + boat.calculateBearingToDestination());//todo - get the wind speed from somewhere + boat.setHeading(newHeading.bearing); + boat.setVelocity(newHeading.speed); +// 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.getHeading())); + } + } } diff --git a/mock/src/test/java/seng302/Model/BoatTest.java b/mock/src/test/java/seng302/Model/BoatTest.java index 47c0e9c2..83d47e6d 100644 --- a/mock/src/test/java/seng302/Model/BoatTest.java +++ b/mock/src/test/java/seng302/Model/BoatTest.java @@ -22,7 +22,7 @@ public class BoatTest { Marker endMarker = new Marker(new GPSCoordinate(50, 0)); Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); - assertEquals(TEST_BOAT.calculateAzimuth(), 0, 1e-8); + assertEquals(TEST_BOAT.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()), 0, 1e-8); } @Test @@ -31,7 +31,7 @@ public class BoatTest { Marker endMarker = new Marker(new GPSCoordinate(-50, 0)); Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); - assertEquals(TEST_BOAT.calculateAzimuth(), 180, 1e-8); + assertEquals(TEST_BOAT.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()), 180, 1e-8); } @@ -42,7 +42,7 @@ public class BoatTest { Marker endMarker = new Marker(new GPSCoordinate(0, 50)); Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); - assertEquals(TEST_BOAT.calculateAzimuth(), 90, 1e-8); + assertEquals(TEST_BOAT.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()), 90, 1e-8); } @@ -52,7 +52,7 @@ public class BoatTest { Marker endMarker = new Marker(new GPSCoordinate(0, -50)); Leg start = new Leg("Start", startMarker, endMarker, 0); TEST_BOAT.setCurrentLeg(start); - assertEquals(TEST_BOAT.calculateAzimuth(), -90, 1e-8); + assertEquals(TEST_BOAT.calculateAzimuth(startMarker.getAverageGPSCoordinate(), endMarker.getAverageGPSCoordinate()), -90, 1e-8); }