diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index f9e5c63a..da82c3dc 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -66,6 +66,7 @@ public class RaceController extends Controller{ BoatInRace[] boatInRaces = new BoatInRace[boats.size()]; raceMap.setBoats(boats.toArray(boatInRaces)); raceMap.drawRaceMap(); + raceMap.updateBoats(); } /** diff --git a/src/main/java/seng302/Model/Boat.java b/src/main/java/seng302/Model/Boat.java index f93b1d18..a0625638 100644 --- a/src/main/java/seng302/Model/Boat.java +++ b/src/main/java/seng302/Model/Boat.java @@ -48,6 +48,10 @@ public class Boat { return velocity; } + public void setVelocity(double velocity) { + this.velocity = velocity; + } + /** * * @return The Name of the boat. diff --git a/src/main/java/seng302/Model/BoatInRace.java b/src/main/java/seng302/Model/BoatInRace.java index a3de0ecb..5291244f 100644 --- a/src/main/java/seng302/Model/BoatInRace.java +++ b/src/main/java/seng302/Model/BoatInRace.java @@ -6,6 +6,7 @@ import javafx.scene.paint.Color; import org.geotools.referencing.GeodeticCalculator; import seng302.GPSCoordinate; +import java.awt.geom.Point2D; /** @@ -147,7 +148,7 @@ public class BoatInRace extends Boat { /** * Converts an azimuth to a bearing - * @param azimuth azimuth valuye to be converted + * @param azimuth azimuth value to be converted * @return the bearings in degrees (0 to 360). */ public static double calculateHeading(double azimuth) { @@ -167,4 +168,17 @@ public class BoatInRace extends Boat { double azimuth = this.calculateAzimuth(); return calculateHeading(azimuth); } + + public GPSCoordinate getWake() { + double reverseHeading = calculateHeading() - 180; + double distance = 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()); + } } diff --git a/src/main/java/seng302/Model/ResizableRaceCanvas.java b/src/main/java/seng302/Model/ResizableRaceCanvas.java index 7fe6c741..36d16531 100644 --- a/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -66,8 +66,9 @@ public class ResizableRaceCanvas extends Canvas { * @see Paint */ public void displayMark(GraphCoordinate graphCoordinate, Paint paint){ + double d = 15; gc.setFill(paint); - gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 15, 15); + gc.fillOval(graphCoordinate.getX() - (d/2), graphCoordinate.getY() - (d/2), d, d); } /** @@ -187,7 +188,6 @@ public class ResizableRaceCanvas extends Canvas { if (boats != null) { for (BoatInRace boat : boats) { if (boat != null) { -// System.out.print("Drawing Boat At: " + boat.getCurrentPosition()); displayMark(this.map.convertGPS(boat.getCurrentPosition()), boat.getColour()); displayText(boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition())); } @@ -198,17 +198,16 @@ public class ResizableRaceCanvas extends Canvas { displayArrow(new GraphCoordinate(500, 20), 100); } - /** - * Draws a boat at a certain GPSCoordinate - * @param colour Colour to colour boat. - * @param gpsCoordinates GPScoordinate that the boat is to be drawn at. - * @see GPSCoordinate - * @see Color - */ - public void drawBoat(Color colour, GPSCoordinate gpsCoordinates) { - GraphCoordinate graphCoordinate = this.map.convertGPS(gpsCoordinates); - //System.out.println("DrawingBoat" + gpsCoordinates.getLongitude()); - displayPoint(graphCoordinate, colour); + public void updateBoats() { + if (boats != null) { + for (BoatInRace boat : boats) { + if (boat != null && !boat.getCurrentLeg().getName().equals("Finish")) { + GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition()); + GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake()); + displayLine(wakeFrom, wakeTo, boat.getColour()); + } + } + } } /** diff --git a/src/test/java/seng302/Model/BoatInRaceTest.java b/src/test/java/seng302/Model/BoatInRaceTest.java index 1e430be1..ba3dd033 100644 --- a/src/test/java/seng302/Model/BoatInRaceTest.java +++ b/src/test/java/seng302/Model/BoatInRaceTest.java @@ -1,6 +1,7 @@ package seng302.Model; import javafx.scene.paint.Color; +import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import seng302.GPSCoordinate; @@ -111,4 +112,43 @@ public class BoatInRaceTest { assertEquals(testBoat.getVelocity(), 20.0); } + + @Test + public void getWakeAtProperHeading() throws Exception { + BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); + + // Construct leg of 0 degrees + GPSCoordinate startPoint = new GPSCoordinate(0, 0); + GPSCoordinate endPoint = new GPSCoordinate(50, 0); + Leg leg0deg = new Leg("Start", startPoint, endPoint, 0); + boat.setCurrentLeg(leg0deg); + boat.setCurrentPosition(new GPSCoordinate(0,0)); + + assertEquals(0, boat.calculateHeading(), 1e-8); + + // Construct leg from wake - heading should be 180 degrees + Leg leg180deg = new Leg("Start", startPoint, boat.getWake(), 0); + boat.setCurrentLeg(leg180deg); + + assertEquals(180, boat.calculateHeading(), 1e-8); + } + + @Test + public void getWakeProportionalToVelocity() throws Exception { + BoatInRace boat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt"); + + // Construct leg of 0 degrees at 0 N + GPSCoordinate startPoint = new GPSCoordinate(0, 0); + GPSCoordinate endPoint = new GPSCoordinate(50, 0); + Leg leg0deg = new Leg("Start", startPoint, endPoint, 0); + boat.setCurrentLeg(leg0deg); + boat.setCurrentPosition(new GPSCoordinate(0,0)); + + // Get latitude of endpoint of wake at 10 kn (longitude is 0) + double endpointAt10Kn = boat.getWake().getLatitude(); + + // Latitude of endpoint at 20 kn should be twice endpoint at 10 kn + boat.setVelocity(20); + assertEquals(2*endpointAt10Kn, boat.getWake().getLatitude(), 1e-8); + } } \ No newline at end of file