diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java index 2c19ea10..276fc329 100644 --- a/racevisionGame/src/main/java/mock/model/MockRace.java +++ b/racevisionGame/src/main/java/mock/model/MockRace.java @@ -379,7 +379,8 @@ public class MockRace extends Race { // boat.getBearing(), // Bearing.fromDegrees(boat.getBearing().degrees() - 1), // Bearing.fromDegrees(boat.getBearing().degrees() + 1)); - VMG vmg = boat.getPolars().setBestVMG(this.getWindDirection(), this.getWindSpeed(), boat.getBearing()); + //VMG vmg = boat.getPolars().setBestVMG(this.getWindDirection(), this.getWindSpeed(), boat.getBearing()); + VMG vmg = new VMG(Math.cos (boat.getBearing().radians() - this.getWindDirection().radians()) * this.getWindSpeed() * 4, boat.getBearing()) ; if (vmg.getSpeed() > 0) { boat.setCurrentSpeed(vmg.getSpeed()); } diff --git a/racevisionGame/src/main/java/mock/model/Polars.java b/racevisionGame/src/main/java/mock/model/Polars.java index a18aa627..35a22fc4 100644 --- a/racevisionGame/src/main/java/mock/model/Polars.java +++ b/racevisionGame/src/main/java/mock/model/Polars.java @@ -23,7 +23,7 @@ public class Polars { private HashMap> polarAngles = new HashMap<>(); //true wind speed, - private HashMap> polars = new HashMap<>(); + private Map> polars = new TreeMap<>(); @@ -87,7 +87,7 @@ public class Polars { polars.get(tws).put(twa, bs); } - public double getClosest(double value, Set set){ + private static double getClosest(double value, Set set){ double closestVal = 0; double smallestDiff = Double.MAX_VALUE; for (double d: set){ @@ -100,6 +100,39 @@ public class Polars { return closestVal; } + /** + * Determines which quadrant degrees are in + * 0/360 Degrees + * Quadrant 4 | Quadrant 1 + * ----------------------- + * Quadrant 3 | Quadrant 2 + * @param degrees + * @return + */ + private static int getQuadrant(double degrees){ + return ((int) degrees % 360) / 90 + 1; + } + + private static double getBestSpeedInQuadrant(int quad, HashMap set){ + double quadVal = (double)((quad - 1) % 2);// this is as the hash map only has values 0 - 180 + double min = quadVal* 90; + double max = (quadVal + 1) * 90; + double maxAngle = 0; + double maxSpeed = 0; + for (Double s: set.keySet()){ + if (s >= min && s < max){ + if (set.get(s) > maxSpeed){ + maxAngle = s; + maxSpeed = set.get(s); + } + } + } + if (quad > 2){ + maxAngle += 180; + } + return maxAngle; + } + /** * * @param trueWindAngle @@ -111,13 +144,15 @@ public class Polars { //speed double closestSpeed = getClosest(trueWindSpeed, polars.keySet()); - //not using true vmg using general concept + //not using true vmg, using general concept double angle = Math.abs(trueWindAngle.degrees() - boatAngle.degrees()); - double closestAngle = getClosest(angle, polars.get(closestSpeed).keySet()); + int quad = getQuadrant(boatAngle.degrees()); + double bestAngle = getBestSpeedInQuadrant(quad, polars.get(closestSpeed)); + + Bearing vmgAngle = Bearing.fromDegrees((bestAngle + trueWindSpeed) % 360); + double boatSpeed = Math.abs(trueWindSpeed * Math.cos(vmgAngle.radians())) * 4; - Bearing vmgAngle = Bearing.fromDegrees(closestAngle); - double boatSpeed = Math.abs(closestSpeed * Math.cos(vmgAngle.radians())) * 4; return new VMG(boatSpeed, vmgAngle); }