Started adding functionality to calculate yacht velocity from the wind speed and direction using polar tables. Also began writing tests to cover this functionality, as it can't currently be tested within the game itself.

#story[986]
This commit is contained in:
Alistair McIntyre
2017-07-20 14:30:13 +12:00
parent e317de7562
commit da7a34fc55
4 changed files with 80 additions and 9 deletions
@@ -1,11 +1,9 @@
package seng302.gameServer; package seng302.gameServer;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import seng302.models.Player; import seng302.models.Player;
import java.util.ArrayList;
import seng302.models.Yacht; import seng302.models.Yacht;
/** /**
@@ -65,6 +63,14 @@ public class GameState {
GameState.currentStage = currentStage; GameState.currentStage = currentStage;
} }
public static Double getWindDirection() {
return windDirection;
}
public static Double getWindSpeed() {
return windSpeed;
}
public static void update() { public static void update() {
Long timeInterval = System.currentTimeMillis() - previousUpdateTime; Long timeInterval = System.currentTimeMillis() - previousUpdateTime;
+5 -2
View File
@@ -1,6 +1,9 @@
package seng302.models; package seng302.models;
import java.io.*; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -140,7 +143,7 @@ public final class PolarTable {
} }
private static Double getClosestMatch(Double thisWindSpeed) { public static Double getClosestMatch(Double thisWindSpeed) {
ArrayList<Double> windValues = new ArrayList<>(polarTable.keySet()); ArrayList<Double> windValues = new ArrayList<>(polarTable.keySet());
+30 -4
View File
@@ -2,12 +2,12 @@ package seng302.models;
import static seng302.utilities.GeoUtility.getGeoCoordinate; import static seng302.utilities.GeoUtility.getGeoCoordinate;
import javafx.scene.paint.Color;
import seng302.models.mark.Mark;
import seng302.controllers.RaceViewController;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Map;
import javafx.scene.paint.Color;
import seng302.controllers.RaceViewController;
import seng302.models.mark.Mark;
import seng302.utilities.GeoPoint; import seng302.utilities.GeoPoint;
/** /**
@@ -96,6 +96,32 @@ public class Yacht {
location = getGeoCoordinate(location, heading, metersCovered); location = getGeoCoordinate(location, heading, metersCovered);
} }
/**
* Adjusts the yachts velocity based on the wind direction and speed from the polar table.
*
* @param windDir current wind Direction TODO: 20/07/17 ajm412: (TWA or AWA, not 100% sure?)
* @param windSpd current wind Speed
*/
public void updateYachtVelocity(Double windDir, Double windSpd) {
Double closestSpd = PolarTable.getClosestMatch(windSpd);
Map<Double, Double> polarsFromClosestSpd = PolarTable.getPolarTable().get(closestSpd);
Double closest = 0d;
Double closest_key = 0d;
for (Double key : polarsFromClosestSpd.keySet()) {
Double difference = Math.abs(key - windDir);
if (difference <= closest) {
closest = difference;
closest_key = key;
}
}
// System.out.println("Closest angle " + closest_key);
// System.out.println("WindDir " + windDir);
velocity = polarsFromClosestSpd.get(closest_key);
}
public String getBoatType() { public String getBoatType() {
return boatType; return boatType;
} }
@@ -0,0 +1,36 @@
package seng302.models;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import seng302.utilities.GeoPoint;
public class YachtTest {
Double windDir;
Double windSpd;
List<Yacht> yachts = new ArrayList<Yacht>();
@Before
public void setUp() {
PolarTable.parsePolarFile(getClass().getResourceAsStream("/config/acc_polars.csv"));
windDir = 90d;
windSpd = 10d;
yachts.add(new Yacht("Yacht 1", "Y1", new GeoPoint(-30.0, 20.0), 160.0));
yachts.add(new Yacht("Yacht 2", "Y2", new GeoPoint(-40.0, -20.0), 100.0));
yachts.add(new Yacht("Yacht 3", "Y3", new GeoPoint(-35.0, -15.5), 20.0));
}
@Test
public void testVelocityUpdate() {
for (Yacht yacht : yachts) {
yacht.updateYachtVelocity(windDir, windSpd);
System.out.println(yacht.getVelocity());
// TODO: 20/07/17 ajm412: add assertions.
}
}
}