From 38951726315e5079daf39262c7d05024c923ff32 Mon Sep 17 00:00:00 2001 From: hba56 Date: Sun, 14 May 2017 17:25:44 +1200 Subject: [PATCH] updated the race class to set heading for windward legs #story[873] --- mock/src/main/java/seng302/Model/Boat.java | 18 ++++++++ mock/src/main/java/seng302/Model/Race.java | 52 ++++++++++++++++++---- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index 47bee639..9b81d975 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -14,6 +14,8 @@ public class Boat { private int sourceID; private Leg currentLeg; private double distanceTravelledInLeg; + private double distanceTravelledInTack; + private double distanceForTack; private GPSCoordinate currentPosition; private long timeFinished = -1; private boolean started = false; @@ -139,6 +141,22 @@ public class Boat { this.distanceTravelledInLeg = distanceTravelledInLeg; } + public double getDistanceTravelledInTack() { + return distanceTravelledInTack; + } + + public void setDistanceTravelledInTack(double distanceTravelledInTack) { + this.distanceTravelledInTack = distanceTravelledInTack; + } + + public double getDistanceForTack() { + return distanceForTack; + } + + public void setDistanceForTack(double distanceForTack) { + this.distanceForTack = distanceForTack; + } + public GPSCoordinate getCurrentPosition() { return currentPosition; } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 316cc131..a1ae7f8c 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -19,6 +19,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import static java.lang.Math.cos; +import static java.lang.Math.max; +import static java.lang.Math.min; + /** * Parent class for races @@ -300,25 +304,57 @@ public class Race implements Runnable { boolean finish = boat.getCurrentLeg().getName().equals("Finish"); if (!finish) { - 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 + int windAngle = 360;//todo - get the wind speed from somewhere, using 360 for now + if(boat.getCurrentLeg().getName().endsWith("to Windward Gate")){//todo something is broken in this if statement, not sure what + double totalDistanceTravelledInTack = distanceTravelled + boat.getDistanceTravelledInTack(); + + double bound1 = (boat.calculateBearingToDestination()-90)%360; + double bound2 = (boat.calculateBearingToDestination()+90)%360; + + VMG newHeading = boat.getPolars().calculateVMG(windAngle, 30, + boat.calculateBearingToDestination(), min(bound1, bound2), max(bound1,bound2)); + + + double azimuth = newHeading.bearing; + if (newHeading.bearing > 180){ + azimuth = newHeading.bearing -360; + } + +// if (!GPSCoordinate.isInsideBoundary(calculatePosition(boat.getCurrentPosition(), +// 1, azimuth), boundary)){ +// System.out.println("LDFSGSDFG"); +// double tempHeading = (newHeading.bearing+90)%360; +// newHeading.bearing = tempHeading; +// } + boat.setHeading(newHeading.bearing); boat.setVelocity(newHeading.speed); -// boat.setHeading(boat.calculateHeading()); + + //calc the distance travelled in a straight line to windward + double angleBetweenDestAndHeading = newHeading.bearing - boat.calculateBearingToDestination(); + totalDistanceTravelled = cos(angleBetweenDestAndHeading)*totalDistanceTravelledInTack; + boat.setDistanceTravelledInLeg(totalDistanceTravelled); + + //Calculate boat's new position by adding the distance travelled onto the start point of the leg + boat.setCurrentPosition(calculatePosition(boat.getCurrentPosition(), + totalDistanceTravelledInTack, azimuth)); + + }else{ + 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())); + totalDistanceTravelled, boat.calculateAzimuth(boat.getCurrentLeg().getStartMarker().getAverageGPSCoordinate(), + boat.getCurrentLeg().getEndMarker().getAverageGPSCoordinate()))); } - } } protected void checkPosition(Boat boat, long timeElapsed) { + System.out.println(boat.getDistanceTravelledInLeg()); + System.out.println(boat.getCurrentLeg().getDistance()); + System.out.println(" "); if (boat.getDistanceTravelledInLeg() > boat.getCurrentLeg().getDistance()) { //boat has passed onto new leg if (boat.getCurrentLeg().getName().equals("Finish")) {