From 4c7295998b0b3843e08058b1721a9274fcb0cecc Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 23 Mar 2017 17:07:16 +1300 Subject: [PATCH 01/10] Added scaler variable to mulitply the race clock and the boats' velocities by - Races take roughly 15 mins realtime with a slowest boat of ~20 knots. Therefore scale by 3 for a 5 min race, and 15 for a 1 min race #story[16] #implement --- src/main/java/seng302/Constants.java | 12 ++++++------ src/main/java/seng302/Model/Boat.java | 11 +++++++++++ .../java/seng302/Model/ConstantVelocityRace.java | 2 +- src/main/java/seng302/Model/Leg.java | 1 + src/main/java/seng302/Model/Race.java | 10 ++++++++-- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/java/seng302/Constants.java b/src/main/java/seng302/Constants.java index afec2bcf..774f4a62 100644 --- a/src/main/java/seng302/Constants.java +++ b/src/main/java/seng302/Constants.java @@ -25,12 +25,12 @@ public class Constants { public static final GPSCoordinate finishLineMarker2 = new GPSCoordinate(32.317257, -64.836260); public static final BoatInRace[] OFFICIAL_AC35_COMPETITORS = new BoatInRace[] - {new BoatInRace("Oracle Team USA", 300.0, Color.BLUEVIOLET, "USA"), - new BoatInRace("Land Rover BAR", 500.0, Color.BLACK, "BAR"), - new BoatInRace("SoftBank Team Japan", 400.0, Color.RED, "JAP"), - new BoatInRace("Groupama Team France", 350.0, Color.ORANGE, "FRN"), - new BoatInRace("Artemis Racing", 440.0, Color.DARKOLIVEGREEN, "ART"), - new BoatInRace("Emirates Team New Zealand", 620, Color.LIMEGREEN, "ENZ")}; + {new BoatInRace("Oracle Team USA", 30.0, Color.BLUEVIOLET, "USA"), + new BoatInRace("Land Rover BAR", 23.0, Color.BLACK, "BAR"), + new BoatInRace("SoftBank Team Japan", 27.0, Color.RED, "JAP"), + new BoatInRace("Groupama Team France", 25.0, Color.ORANGE, "FRN"), + new BoatInRace("Artemis Racing", 22.5, Color.DARKOLIVEGREEN, "ART"), + new BoatInRace("Emirates Team New Zealand", 62, Color.LIMEGREEN, "ENZ")}; //public static final Leg bermudaCourseStartToMark1 = new Leg(0, , new ) } diff --git a/src/main/java/seng302/Model/Boat.java b/src/main/java/seng302/Model/Boat.java index e2169e56..cbaab39e 100644 --- a/src/main/java/seng302/Model/Boat.java +++ b/src/main/java/seng302/Model/Boat.java @@ -12,7 +12,9 @@ import java.util.ArrayList; */ public class Boat { private StringProperty name; + private double velocity; + private double scaledVelocity; private StringProperty velocityProp; private String abbrev; @@ -48,6 +50,15 @@ public class Boat { return velocity; } + + public double getScaledVelocity() { + return scaledVelocity; + } + + public void setScaledVelocity(double velocity) { + this.scaledVelocity = velocity; + } + /** * * @return The Name of the boat. diff --git a/src/main/java/seng302/Model/ConstantVelocityRace.java b/src/main/java/seng302/Model/ConstantVelocityRace.java index 1b83c92d..85e661ae 100644 --- a/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -33,7 +33,7 @@ public class ConstantVelocityRace extends Race { protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { //distanceTravelled = velocity (nm p hr) * time taken to update loop - double distanceTravelled = boat.getVelocity() * millisecondsElapsed/3600000; + double distanceTravelled = boat.getScaledVelocity() * millisecondsElapsed/3600000; double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); boolean finish = boat.getCurrentLeg().getName().equals("Finish"); diff --git a/src/main/java/seng302/Model/Leg.java b/src/main/java/seng302/Model/Leg.java index 3cc41743..dd3b96da 100644 --- a/src/main/java/seng302/Model/Leg.java +++ b/src/main/java/seng302/Model/Leg.java @@ -28,6 +28,7 @@ public class Leg { this.endGPSCoordinate = end; this.legNumber = number; this.distance = calculateDistance(); + System.out.println("Distance of leg " + name + " is " + Double.toString(distance)); } /** diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index ed5131a0..a740acbc 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -22,6 +22,7 @@ public abstract class Race implements Runnable { protected RaceController controller; protected int boatsFinished = 0; protected long totalTimeElapsed; + protected int scale_factor = 15; private int SLEEP_TIME = 100; //time in milliseconds to pause in a paced loop @@ -34,6 +35,10 @@ public abstract class Race implements Runnable { * @param legs Number of marks in order that the boats pass in order to complete the race. */ public Race(BoatInRace[] boats, ArrayList legs, RaceController controller) { + for (BoatInRace boat : boats) { + boat.setScaledVelocity(boat.getVelocity() * scale_factor); + } + this.startingBoats = FXCollections.observableArrayList(boats); this.legs = legs; this.legs.add(new Leg("Finish", this.legs.size())); @@ -117,8 +122,9 @@ public abstract class Race implements Runnable { long hours; currentTimeInSeconds = totalTimeElapsed / 1000; - minutes = currentTimeInSeconds / 60; - remainingSeconds = currentTimeInSeconds % 60; + long scaledTimeInSeconds = currentTimeInSeconds * scale_factor; + minutes = scaledTimeInSeconds / 60; + remainingSeconds = scaledTimeInSeconds % 60; hours = minutes / 60; minutes = minutes % 60; return String.format("Race clock: %02d:%02d:%02d", hours, minutes, remainingSeconds); From 944da8194689c8d2910401a8f8d11f4f2ac6bf14 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Thu, 23 Mar 2017 17:37:52 +1300 Subject: [PATCH 02/10] Test that boat velocities are being scaled correctly added #story[16] #implement --- .../seng302/Model/ConstantVelocityRace.java | 4 +++ src/main/java/seng302/Model/Race.java | 25 ++++++++++++++----- src/test/java/seng302/Model/RaceTest.java | 21 ++++++++++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/main/java/seng302/Model/ConstantVelocityRace.java b/src/main/java/seng302/Model/ConstantVelocityRace.java index 85e661ae..900f81ed 100644 --- a/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -30,6 +30,10 @@ public class ConstantVelocityRace extends Race { super(startingBoats, marks); } + public ConstantVelocityRace(BoatInRace[] startingBoats, ArrayList marks, int scaleFactor) { + super(startingBoats, marks, scaleFactor); + } + protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { //distanceTravelled = velocity (nm p hr) * time taken to update loop diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index a740acbc..4533c646 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -2,12 +2,9 @@ package seng302.Model; import javafx.application.Platform; -import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; -import javafx.collections.ObservableArray; import javafx.collections.ObservableList; import seng302.Controllers.RaceController; -import seng302.GPSCoordinate; import java.util.*; @@ -22,8 +19,8 @@ public abstract class Race implements Runnable { protected RaceController controller; protected int boatsFinished = 0; protected long totalTimeElapsed; - protected int scale_factor = 15; + protected int scaleFactor = 1; private int SLEEP_TIME = 100; //time in milliseconds to pause in a paced loop protected int PRERACE_TIME = 10000;//Integer.MAX_VALUE; //time in milliseconds to pause during pre-race @@ -36,7 +33,7 @@ public abstract class Race implements Runnable { */ public Race(BoatInRace[] boats, ArrayList legs, RaceController controller) { for (BoatInRace boat : boats) { - boat.setScaledVelocity(boat.getVelocity() * scale_factor); + boat.setScaledVelocity(boat.getVelocity() * scaleFactor); } this.startingBoats = FXCollections.observableArrayList(boats); @@ -54,6 +51,22 @@ public abstract class Race implements Runnable { this(boats, marks, null); } + public Race(BoatInRace[] boats, ArrayList legs, int scaleFactor) { + for (BoatInRace boat : boats) { + boat.setScaledVelocity(boat.getVelocity() * scaleFactor); + } + this.startingBoats = FXCollections.observableArrayList(boats); + this.legs = legs; + this.legs.add(new Leg("Finish", this.legs.size())); + this.scaleFactor = scaleFactor; + } + + + + public void setScaleFactor(int scaleFactor) { + this.scaleFactor = scaleFactor; + } + /** * Runnable for the thread. */ @@ -122,7 +135,7 @@ public abstract class Race implements Runnable { long hours; currentTimeInSeconds = totalTimeElapsed / 1000; - long scaledTimeInSeconds = currentTimeInSeconds * scale_factor; + long scaledTimeInSeconds = currentTimeInSeconds * scaleFactor; minutes = scaledTimeInSeconds / 60; remainingSeconds = scaledTimeInSeconds % 60; hours = minutes / 60; diff --git a/src/test/java/seng302/Model/RaceTest.java b/src/test/java/seng302/Model/RaceTest.java index 5f71f764..ab1d2ed3 100644 --- a/src/test/java/seng302/Model/RaceTest.java +++ b/src/test/java/seng302/Model/RaceTest.java @@ -110,4 +110,25 @@ public class RaceTest { assertTrue(System.currentTimeMillis() - timeStarted > 500); } + + @Test + public void scalerScalesVelocityCorrectly() { + + int scaleFactor = 0; + float vel1 = 0; + float vel2 = (float) 1.999; + float vel3 = (float) 32.5; + float vel4 = 500; + BoatInRace boat1 = new BoatInRace("test", vel1, Color.ALICEBLUE, "tt"); + BoatInRace boat2 = new BoatInRace("test", vel2, Color.ALICEBLUE, "tt"); + BoatInRace boat3 = new BoatInRace("test", vel3, Color.ALICEBLUE, "tt"); + BoatInRace boat4 = new BoatInRace("test", vel4, Color.ALICEBLUE, "tt"); + BoatInRace[] boats = new BoatInRace[] {boat1, boat2, boat3, boat4}; + + ConstantVelocityRace race = new ConstantVelocityRace(boats, new ArrayList(), scaleFactor); + assertEquals(race.getStartingBoats().get(0).getScaledVelocity(), vel1 * scaleFactor, 1e-8); + assertEquals(race.getStartingBoats().get(1).getScaledVelocity(), vel2 * scaleFactor, 1e-8); + assertEquals(race.getStartingBoats().get(2).getScaledVelocity(), vel3 * scaleFactor, 1e-8); + assertEquals(race.getStartingBoats().get(3).getScaledVelocity(), vel4 * scaleFactor, 1e-8); + } } From d23a80841a16f58d1911e8c23cc42e525a0ff2f8 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Fri, 24 Mar 2017 11:57:54 +1300 Subject: [PATCH 03/10] Tests for race clock being scaled correctly added #story[16] #test --- src/main/java/seng302/Model/Race.java | 10 ++++-- src/test/java/seng302/Model/RaceTest.java | 40 ++++++++++++++++------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index 4533c646..a7b30fe2 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -20,7 +20,7 @@ public abstract class Race implements Runnable { protected int boatsFinished = 0; protected long totalTimeElapsed; - protected int scaleFactor = 1; + protected int scaleFactor = 15; private int SLEEP_TIME = 100; //time in milliseconds to pause in a paced loop protected int PRERACE_TIME = 10000;//Integer.MAX_VALUE; //time in milliseconds to pause during pre-race @@ -52,8 +52,12 @@ public abstract class Race implements Runnable { } public Race(BoatInRace[] boats, ArrayList legs, int scaleFactor) { - for (BoatInRace boat : boats) { - boat.setScaledVelocity(boat.getVelocity() * scaleFactor); + if (boats.length > 0) { + for (BoatInRace boat : boats) { + if (boat != null) { + boat.setScaledVelocity(boat.getVelocity() * scaleFactor); + } + } } this.startingBoats = FXCollections.observableArrayList(boats); this.legs = legs; diff --git a/src/test/java/seng302/Model/RaceTest.java b/src/test/java/seng302/Model/RaceTest.java index ab1d2ed3..10e56bce 100644 --- a/src/test/java/seng302/Model/RaceTest.java +++ b/src/test/java/seng302/Model/RaceTest.java @@ -30,16 +30,16 @@ public class RaceTest { new BoatInRace("AU", 2800, Color.BEIGE, "AU") }; ArrayList legs = new ArrayList<>(); - legs.add(new Leg("Start", new GPSCoordinate(32.296577, -64.854304),new GPSCoordinate(32.293039, -64.843983),0)); - legs.add(new Leg("Start", new GPSCoordinate(32.293039, -64.843983),new GPSCoordinate(32.284680, -64.850045),1)); + legs.add(new Leg("Start", new GPSCoordinate(32.296577, -64.854304), new GPSCoordinate(32.293039, -64.843983), 0)); + legs.add(new Leg("Start", new GPSCoordinate(32.293039, -64.843983), new GPSCoordinate(32.284680, -64.850045), 1)); Race race = new ConstantVelocityRace(boats, legs); race.disableTimer(); // Boats should finish in an order determined by their velocity - Arrays.sort(boats, (a,b) -> (int)(b.getVelocity()-a.getVelocity())); + Arrays.sort(boats, (a, b) -> (int) (b.getVelocity() - a.getVelocity())); race.run(); - for(int i = 0; i < boats.length; i++) + for (int i = 0; i < boats.length; i++) assertTrue(boats[i].equals(race.getStartingBoats().get(i))); } @@ -84,7 +84,8 @@ public class RaceTest { Leg leg1 = new Leg("1", new GPSCoordinate(0, 0), new GPSCoordinate(1, 1), 0); Leg leg2 = new Leg("2", new GPSCoordinate(0, 0), new GPSCoordinate(1, 1), 1); - legs.add(leg2); legs.add(leg2); + legs.add(leg2); + legs.add(leg2); ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[1], legs); @@ -114,7 +115,7 @@ public class RaceTest { @Test public void scalerScalesVelocityCorrectly() { - int scaleFactor = 0; + int scaleFactor = 3; float vel1 = 0; float vel2 = (float) 1.999; float vel3 = (float) 32.5; @@ -123,12 +124,29 @@ public class RaceTest { BoatInRace boat2 = new BoatInRace("test", vel2, Color.ALICEBLUE, "tt"); BoatInRace boat3 = new BoatInRace("test", vel3, Color.ALICEBLUE, "tt"); BoatInRace boat4 = new BoatInRace("test", vel4, Color.ALICEBLUE, "tt"); - BoatInRace[] boats = new BoatInRace[] {boat1, boat2, boat3, boat4}; + BoatInRace[] boats = new BoatInRace[]{boat1, boat2, boat3, boat4}; ConstantVelocityRace race = new ConstantVelocityRace(boats, new ArrayList(), scaleFactor); - assertEquals(race.getStartingBoats().get(0).getScaledVelocity(), vel1 * scaleFactor, 1e-8); - assertEquals(race.getStartingBoats().get(1).getScaledVelocity(), vel2 * scaleFactor, 1e-8); - assertEquals(race.getStartingBoats().get(2).getScaledVelocity(), vel3 * scaleFactor, 1e-8); - assertEquals(race.getStartingBoats().get(3).getScaledVelocity(), vel4 * scaleFactor, 1e-8); + assertEquals(race.getStartingBoats().get(0).getScaledVelocity(), vel1 * scaleFactor, 1e-6); + assertEquals(race.getStartingBoats().get(1).getScaledVelocity(), vel2 * scaleFactor, 1e-6); + assertEquals(race.getStartingBoats().get(2).getScaledVelocity(), vel3 * scaleFactor, 1e-6); + assertEquals(race.getStartingBoats().get(3).getScaledVelocity(), vel4 * scaleFactor, 1e-6); + } + + @Test + public void scalerScalesRaceClockTo1MinCorrectly() { + int scaleFactor = 10; + ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[5], new ArrayList(), scaleFactor); + race.totalTimeElapsed = 6000; //6 seconds + assertTrue(race.calcTimer().equals("Race clock: 00:01:00")); + } + + @Test + public void scalerScalesRaceClockHoursMinutesAndSecondsCorrectly() { + int scaleFactor = 3; + ConstantVelocityRace race = new ConstantVelocityRace(new BoatInRace[5], new ArrayList(), scaleFactor); + race.totalTimeElapsed = 3213000; + assertTrue(race.calcTimer().equals("Race clock: 02:40:39")); + } } From 9c22fe76bd880c7aa86d8a984130d62a5c013242 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Fri, 24 Mar 2017 12:24:56 +1300 Subject: [PATCH 04/10] Adjusting existing layout to prepare for creating new pane - Adjusted default height and width to be a larger display - Increased percentage space the side table takes up because the team name, mark etc were very cramped #implement #story[16]: --- src/main/java/seng302/App.java | 2 +- src/main/resources/scenes/racepane.fxml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index 90f61908..09e6c74d 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -32,7 +32,7 @@ public class App extends Application FXMLLoader loader = new FXMLLoader(); InputStream in = getClass().getClassLoader().getResourceAsStream("scenes//mainpane.fxml"); mainContainer = (BorderPane) loader.load(in); - mainScene = new Scene(mainContainer, 800, 600); + mainScene = new Scene(mainContainer, 1200, 800); primaryStage.setScene(mainScene); primaryStage.sizeToScene(); MainController mainController = (MainController) loader.getController(); diff --git a/src/main/resources/scenes/racepane.fxml b/src/main/resources/scenes/racepane.fxml index ed538a38..4abc1d7b 100644 --- a/src/main/resources/scenes/racepane.fxml +++ b/src/main/resources/scenes/racepane.fxml @@ -7,19 +7,19 @@ - + - + - + - - + + From 0fde0cd9b59716d25c21ffbecae688b417261a50 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Fri, 24 Mar 2017 13:03:03 +1300 Subject: [PATCH 05/10] Created new start screen and implemented switching from start to race map #implement #story[16] --- .../seng302/Controllers/RaceController.java | 20 ++++++++++++++++--- src/main/resources/scenes/racepane.fxml | 20 +++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index 317d69da..a4981583 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -12,6 +12,7 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.util.Callback; import org.geotools.referencing.GeodeticCalculator; @@ -33,6 +34,9 @@ public class RaceController extends Controller{ @FXML AnchorPane canvasBase; + @FXML + GridPane startScreen; + ResizableRaceCanvas raceMap; @FXML @@ -80,8 +84,9 @@ public class RaceController extends Controller{ }); } - @Override - public void initialize(URL location, ResourceBundle resources) { + + @FXML + public void startRace() { BoatInRace[] boats = generateAC35Competitors(); @@ -92,13 +97,22 @@ public class RaceController extends Controller{ raceMap.drawRaceMap(); canvasBase.getChildren().add(raceMap); + startScreen.setVisible(false); ArrayList legs = generateBermudaCourseLegs(); ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, this); - + raceMap.setVisible(true); (new Thread(race)).start(); } + @Override + public void initialize(URL location, ResourceBundle resources) { + + + } + + + /** * Function for the Bermuda Race. * @return legs in the Bermuda Race. diff --git a/src/main/resources/scenes/racepane.fxml b/src/main/resources/scenes/racepane.fxml index 4abc1d7b..b233563d 100644 --- a/src/main/resources/scenes/racepane.fxml +++ b/src/main/resources/scenes/racepane.fxml @@ -1,5 +1,6 @@ + @@ -9,13 +10,28 @@ - +