From d3937660272f9b5f631e3ca8bc5e1107947661c1 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Thu, 16 Mar 2017 17:44:34 +1300 Subject: [PATCH 1/6] Partially completed story 13 --- .../seng302/Controllers/RaceController.java | 37 +++++++++++++++++-- src/main/java/seng302/Model/Boat.java | 4 ++ src/main/java/seng302/Model/Race.java | 11 +++++- src/main/resources/scenes/racepane.fxml | 3 +- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index e0f1a867..83e6b2fb 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -1,13 +1,21 @@ package seng302.Controllers; +import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; +import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; +import seng302.GPSCoordinate; import seng302.GraphCoordinate; +import seng302.Model.Boat; +import seng302.Model.BoatInRace; +import seng302.Model.ConstantVelocityRace; +import seng302.Model.Leg; import seng302.RaceMap; import java.net.URL; @@ -20,10 +28,19 @@ public class RaceController extends Controller{ @FXML Canvas raceMap; @FXML - TableView boatInfoTable; + TableView boatInfoTable; @FXML AnchorPane canvasBase; - + /* + @FXML + TableColumn boatPlacingColumn; + */ + @FXML + TableColumn boatTeamColumn; + /* + @FXML + TableColumn boatMarkColumn; + */ private GraphicsContext gc; private RaceMap map; @@ -50,8 +67,22 @@ public class RaceController extends Controller{ public void initialize(URL location, ResourceBundle resources) {/* raceMap.widthProperty().bind(canvasBase.widthProperty()); raceMap.heightProperty().bind(canvasBase.heightProperty());*/ - this.gc = raceMap.getGraphicsContext2D(); + + BoatInRace boat = new BoatInRace("NZ", 10000); + BoatInRace[] boats = new BoatInRace[] {boat}; + Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(1, 1), 0); + Leg[] legs = new Leg[] {leg1}; + + ConstantVelocityRace race = new ConstantVelocityRace(boats, legs); + + (new Thread(race)).start(); + //table view + boatTeamColumn.setCellValueFactory(new PropertyValueFactory("Name")); + boatInfoTable.setItems(FXCollections.observableArrayList(race.getFinishingBoats())); + this.map = new RaceMap(32.321989, -64.8553, 32.246, -64.831, (int)raceMap.getWidth(), (int)raceMap.getHeight()); + + this.gc = raceMap.getGraphicsContext2D(); //boat GraphCoordinate boat1coord = this.map.convertGPS(32.296577, -64.854304); displayBoat(boat1coord, Color.AQUAMARINE); diff --git a/src/main/java/seng302/Model/Boat.java b/src/main/java/seng302/Model/Boat.java index 25d67520..3fedb34e 100644 --- a/src/main/java/seng302/Model/Boat.java +++ b/src/main/java/seng302/Model/Boat.java @@ -27,6 +27,10 @@ public class Boat { return name; } + public void setName(String name) { + this.name = name; + } + /** * * @return returns the speed of the boat. diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index d61b7221..f1dc3093 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -7,7 +7,7 @@ import java.util.*; * Parent class for races * Created by fwy13 on 3/03/17. */ -public abstract class Race { +public abstract class Race implements Runnable { protected BoatInRace[] startingBoats; protected ArrayList finishingBoats = new ArrayList<>(); protected Leg[] legs; @@ -26,9 +26,11 @@ public abstract class Race { } public void run() { + long time = System.currentTimeMillis(); preRace(); simulateRace(); - + System.out.println(System.currentTimeMillis() - time); + System.out.println(finishingBoats.get(0)); } private void preRace() { @@ -90,6 +92,11 @@ public abstract class Race { } + + public ArrayList getFinishingBoats() { + return finishingBoats; + } + /** * This function is a function that generates the Race and populates the events list. * Is automatically called by the initialiser function, so that simulateRace() does not return an empty race. diff --git a/src/main/resources/scenes/racepane.fxml b/src/main/resources/scenes/racepane.fxml index 8eaf63a6..9803ca44 100644 --- a/src/main/resources/scenes/racepane.fxml +++ b/src/main/resources/scenes/racepane.fxml @@ -18,8 +18,7 @@ - - + From bc4701ef32d272280ddc7a07a9853d9afb33ad2f Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Fri, 17 Mar 2017 10:30:40 +1300 Subject: [PATCH 2/6] Fixed Canvas not filling screen issue - Created ResizableRaceCanvas Class - Moved all draw functions to ResizableRaceCanvas #fix --- .../seng302/Controllers/RaceController.java | 73 ++--------- .../seng302/Model/ResizableRaceCanvas.java | 117 ++++++++++++++++++ src/main/resources/scenes/racepane.fxml | 15 +-- 3 files changed, 133 insertions(+), 72 deletions(-) create mode 100644 src/main/java/seng302/Model/ResizableRaceCanvas.java diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index 7f888ccd..ffabf55a 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -5,10 +5,13 @@ import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.TableView; import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.transform.Rotate; import seng302.GraphCoordinate; +import seng302.Model.ResizableRaceCanvas; import seng302.RaceMap; import java.net.URL; @@ -18,78 +21,22 @@ import java.util.ResourceBundle; * Created by Gondr on 15/03/2017. */ public class RaceController extends Controller{ - @FXML - Canvas raceMap; @FXML TableView boatInfoTable; @FXML AnchorPane canvasBase; + @FXML + ResizableRaceCanvas raceMap; private GraphicsContext gc; private RaceMap map; - public void displayBoat(GraphCoordinate graphCoordinate, Paint paint){ - gc.setFill(paint); - gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 15, 15); - } - - public void displayLine(GraphCoordinate graphCoordinateA, GraphCoordinate graphCoordinateB, Paint paint){ - gc.setStroke(paint); - gc.setFill(paint); - gc.fillOval(graphCoordinateA.getX() - 3, graphCoordinateA.getY() - 3, 6, 6); - gc.fillOval(graphCoordinateB.getX() - 3, graphCoordinateB.getY() - 3, 6, 6); - gc.strokeLine(graphCoordinateA.getX(), graphCoordinateA.getY(), graphCoordinateB.getX(), graphCoordinateB.getY()); - } - - - public void displayPoint(GraphCoordinate graphCoordinate, Paint paint){ - gc.setFill(paint); - gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 10, 10); - } - - public void displayArrow(GraphCoordinate coordinate, Paint paint){ - rotate(10, 30,30); - gc.fillPolygon(new double[]{0, 6, 12, 8, 8, 4, 4}, - new double[]{15, 0, 15, 15, 40, 40, 15}, - 7); - gc.restore(); - } - - private void rotate(double angle, double px, double py) { - Rotate r = new Rotate(angle, px, py); - gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy()); - } - @Override - public void initialize(URL location, ResourceBundle resources) {/* + public void initialize(URL location, ResourceBundle resources) { + raceMap = new ResizableRaceCanvas(); raceMap.widthProperty().bind(canvasBase.widthProperty()); - raceMap.heightProperty().bind(canvasBase.heightProperty());*/ - this.gc = raceMap.getGraphicsContext2D(); - this.map = new RaceMap(32.321989, -64.8553, 32.246, -64.831, (int)raceMap.getWidth(), (int)raceMap.getHeight()); - //boat - GraphCoordinate boat1coord = this.map.convertGPS(32.296577, -64.854304); - displayBoat(boat1coord, Color.AQUAMARINE); - //finish line - gc.setLineWidth(2); - GraphCoordinate finishLineCoord1 = this.map.convertGPS(32.317379, -64.839291); - GraphCoordinate finishLineCoord2 = this.map.convertGPS(32.317257, -64.836260); - displayLine(finishLineCoord1, finishLineCoord2, Color.DARKRED); - //marks - GraphCoordinate markCoord = this.map.convertGPS(32.293039, -64.843983); - GraphCoordinate southGate1 = this.map.convertGPS(32.284680, -64.850045); - GraphCoordinate southGate2 = this.map.convertGPS(32.280164, -64.847591); - GraphCoordinate northGate1 = this.map.convertGPS(32.309693, -64.835249); - GraphCoordinate northGate2 = this.map.convertGPS(32.308046, -64.831785); - displayBoat(boat1coord, Color.AQUAMARINE); - displayBoat(markCoord, Color.GOLD); - displayLine(southGate1, southGate2, Color.DARKCYAN); - displayLine(northGate1, northGate2, Color.DARKVIOLET); - //start line - GraphCoordinate startline1 = this.map.convertGPS(32.296577, -64.854304); - GraphCoordinate startline2 = this.map.convertGPS(32.293771, -64.855242); - displayLine(startline1, startline2, Color.GREEN); - - displayPoint(this.map.convertGPS(32.293771, -64.855242), Color.BLACK); - displayArrow(new GraphCoordinate(100, 100), Color.BLUEVIOLET); + raceMap.heightProperty().bind(canvasBase.heightProperty()); + raceMap.draw(); + canvasBase.getChildren().add(raceMap); } } diff --git a/src/main/java/seng302/Model/ResizableRaceCanvas.java b/src/main/java/seng302/Model/ResizableRaceCanvas.java new file mode 100644 index 00000000..a7137fff --- /dev/null +++ b/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -0,0 +1,117 @@ +package seng302.Model; + +import javafx.scene.canvas.Canvas; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; +import javafx.scene.transform.Rotate; +import seng302.GraphCoordinate; +import seng302.RaceMap; + +/** + * Created by fwy13 on 17/03/17. + */ +public class ResizableRaceCanvas extends Canvas { + GraphicsContext gc; + RaceMap map; + + public ResizableRaceCanvas(RaceMap map) { + this.map = map; + gc = this.getGraphicsContext2D(); + // Redraw canvas when size changes. + widthProperty().addListener(evt -> draw()); + heightProperty().addListener(evt -> draw()); + } + + public ResizableRaceCanvas(){ + this(null); + } + + public void setMap (RaceMap map) { + this.map = map; + } + + public void displayBoat(GraphCoordinate graphCoordinate, Paint paint){ + gc.setFill(paint); + gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 15, 15); + } + + public void displayLine(GraphCoordinate graphCoordinateA, GraphCoordinate graphCoordinateB, Paint paint){ + gc.setStroke(paint); + gc.setFill(paint); + gc.fillOval(graphCoordinateA.getX() - 3, graphCoordinateA.getY() - 3, 6, 6); + gc.fillOval(graphCoordinateB.getX() - 3, graphCoordinateB.getY() - 3, 6, 6); + gc.strokeLine(graphCoordinateA.getX(), graphCoordinateA.getY(), graphCoordinateB.getX(), graphCoordinateB.getY()); + } + + + public void displayPoint(GraphCoordinate graphCoordinate, Paint paint){ + gc.setFill(paint); + gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 10, 10); + } + + public void displayArrow(GraphCoordinate coordinate, Paint paint){ + rotate(10, 30,30); + gc.fillPolygon(new double[]{0, 6, 12, 8, 8, 4, 4}, + new double[]{15, 0, 15, 15, 40, 40, 15}, + 7); + gc.restore(); + } + + private void rotate(double angle, double px, double py) { + Rotate r = new Rotate(angle, px, py); + gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy()); + } + + public void draw() { + double width = getWidth(); + double height = getHeight(); + System.out.println("Race Map Canvas Width: "+ width + ", Height:" + height); + this.map = new RaceMap(32.321989, -64.873, 32.28, -64.831, (int)width, (int)height); + + if (map == null){ + return; + } + System.out.println("Drawing"); + gc.clearRect(0, 0, width, height); + //boat + GraphCoordinate boat1coord = map.convertGPS(32.296577, -64.854304); + displayBoat(boat1coord, Color.AQUAMARINE); + //finish line + gc.setLineWidth(2); + GraphCoordinate finishLineCoord1 = map.convertGPS(32.317379, -64.839291); + GraphCoordinate finishLineCoord2 = map.convertGPS(32.317257, -64.836260); + displayLine(finishLineCoord1, finishLineCoord2, Color.DARKRED); + //marks + GraphCoordinate markCoord = map.convertGPS(32.293039, -64.843983); + GraphCoordinate southGate1 = map.convertGPS(32.284680, -64.850045); + GraphCoordinate southGate2 = map.convertGPS(32.280164, -64.847591); + GraphCoordinate northGate1 = map.convertGPS(32.309693, -64.835249); + GraphCoordinate northGate2 = map.convertGPS(32.308046, -64.831785); + displayBoat(boat1coord, Color.AQUAMARINE); + displayBoat(markCoord, Color.GOLD); + displayLine(southGate1, southGate2, Color.DARKCYAN); + displayLine(northGate1, northGate2, Color.DARKVIOLET); + //start line + GraphCoordinate startline1 = map.convertGPS(32.296577, -64.854304); + GraphCoordinate startline2 = map.convertGPS(32.293771, -64.855242); + displayLine(startline1, startline2, Color.GREEN); + + displayArrow(new GraphCoordinate(100, 100), Color.BLUEVIOLET); + } + + @Override + public boolean isResizable() { + return true; + } + + @Override + public double prefWidth(double height) { + return getWidth(); + } + + @Override + public double prefHeight(double width) { + return getHeight(); + } +} diff --git a/src/main/resources/scenes/racepane.fxml b/src/main/resources/scenes/racepane.fxml index 8eaf63a6..4f9f5639 100644 --- a/src/main/resources/scenes/racepane.fxml +++ b/src/main/resources/scenes/racepane.fxml @@ -7,16 +7,13 @@ - - - - - - + + + - + - + @@ -24,7 +21,7 @@ - + From 456925c4c6509caf2c59889cd528da13b323e000 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Fri, 17 Mar 2017 11:15:15 +1300 Subject: [PATCH 3/6] Implemented table view for finishing list - Added auto-numbered placing, team name, and last mark columns - Added dummy 'Finish' mark to race - Added callback for race to update controller #story [13] --- .../seng302/Controllers/RaceController.java | 34 ++++++++++++------- .../seng302/Model/ConstantVelocityRace.java | 5 +++ src/main/java/seng302/Model/Leg.java | 8 +++++ src/main/java/seng302/Model/Race.java | 15 ++++++-- src/main/resources/scenes/racepane.fxml | 4 ++- 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index 83e6b2fb..9c974b68 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -1,5 +1,7 @@ package seng302.Controllers; +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.canvas.Canvas; @@ -10,15 +12,16 @@ import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; +import javafx.util.Callback; import seng302.GPSCoordinate; import seng302.GraphCoordinate; -import seng302.Model.Boat; -import seng302.Model.BoatInRace; -import seng302.Model.ConstantVelocityRace; -import seng302.Model.Leg; +import seng302.Model.*; import seng302.RaceMap; import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Observable; import java.util.ResourceBundle; /** @@ -31,16 +34,13 @@ public class RaceController extends Controller{ TableView boatInfoTable; @FXML AnchorPane canvasBase; - /* @FXML TableColumn boatPlacingColumn; - */ @FXML TableColumn boatTeamColumn; - /* @FXML TableColumn boatMarkColumn; - */ + private GraphicsContext gc; private RaceMap map; @@ -63,6 +63,19 @@ public class RaceController extends Controller{ gc.fillOval(graphCoordinate.getX(), graphCoordinate.getY(), 10, 10); } + public void updateInfoTable(Race race) { + boatInfoTable.setItems(FXCollections.observableArrayList(race.getFinishingBoats())); + + boatTeamColumn.setCellValueFactory(new PropertyValueFactory("Name")); + boatMarkColumn.setCellValueFactory(new PropertyValueFactory("CurrentLeg")); + boatPlacingColumn.setCellValueFactory(new Callback, ObservableValue>() { + @Override + public ObservableValue call(TableColumn.CellDataFeatures table) { + return new ReadOnlyObjectWrapper(boatInfoTable.getItems().indexOf(table.getValue()) + 1); + } + }); + } + @Override public void initialize(URL location, ResourceBundle resources) {/* raceMap.widthProperty().bind(canvasBase.widthProperty()); @@ -73,12 +86,9 @@ public class RaceController extends Controller{ Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(1, 1), 0); Leg[] legs = new Leg[] {leg1}; - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs); + ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, this); (new Thread(race)).start(); - //table view - boatTeamColumn.setCellValueFactory(new PropertyValueFactory("Name")); - boatInfoTable.setItems(FXCollections.observableArrayList(race.getFinishingBoats())); this.map = new RaceMap(32.321989, -64.8553, 32.246, -64.831, (int)raceMap.getWidth(), (int)raceMap.getHeight()); diff --git a/src/main/java/seng302/Model/ConstantVelocityRace.java b/src/main/java/seng302/Model/ConstantVelocityRace.java index a6e34e67..c5526fc2 100644 --- a/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -1,5 +1,6 @@ package seng302.Model; +import seng302.Controllers.RaceController; import seng302.GPSCoordinate; import seng302.GraphCoordinate; @@ -17,6 +18,10 @@ public class ConstantVelocityRace extends Race { * @see Leg */ + public ConstantVelocityRace(BoatInRace[] startingBoats, Leg[] marks, RaceController controller) { + super(startingBoats, marks, controller); + } + public ConstantVelocityRace(BoatInRace[] startingBoats, Leg[] marks) { super(startingBoats, marks); } diff --git a/src/main/java/seng302/Model/Leg.java b/src/main/java/seng302/Model/Leg.java index 699c9f63..67557ab8 100644 --- a/src/main/java/seng302/Model/Leg.java +++ b/src/main/java/seng302/Model/Leg.java @@ -28,6 +28,14 @@ public class Leg { this.legNumber = number; } + public Leg(String name) { + this.name = name; + this.distance = 0; + this.startGPSCoordinate = new GPSCoordinate(0,0); + this.endGPSCoordinate = new GPSCoordinate(0,0); + this.legNumber = 0; + } + /** * * @return the name of the Leg diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index f1dc3093..8d8342a3 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -1,6 +1,9 @@ package seng302.Model; +import seng302.Controllers.RaceController; +import seng302.GPSCoordinate; + import java.util.*; /** @@ -11,6 +14,7 @@ public abstract class Race implements Runnable { protected BoatInRace[] startingBoats; protected ArrayList finishingBoats = new ArrayList<>(); protected Leg[] legs; + protected RaceController controller; private int SLEEP_TIME = 1000; //time in milliseconds to pause in a paced loop @@ -19,18 +23,22 @@ public abstract class Race implements Runnable { * @param boats Takes in an array of boats that are participating in the race. * @param marks Number of marks in order that the boats pass in order to complete the race. */ - public Race(BoatInRace[] boats, Leg[] marks) { + public Race(BoatInRace[] boats, Leg[] marks, RaceController controller) { this.startingBoats = boats; this.legs = marks; + this.controller = controller; + } + public Race(BoatInRace[] boats, Leg[] marks) { + this.startingBoats = boats; + this.legs = marks; } public void run() { long time = System.currentTimeMillis(); preRace(); simulateRace(); - System.out.println(System.currentTimeMillis() - time); - System.out.println(finishingBoats.get(0)); + if(controller != null) controller.updateInfoTable(this); } private void preRace() { @@ -81,6 +89,7 @@ public abstract class Race implements Runnable { if (boat.getCurrentLeg().getLegNumber() == legs.length - 1) { //boat has finished boat.setTimeFinished(timeElapsed); + boat.setCurrentLeg(new Leg("Finish")); finishingBoats.add(boat); } else { boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); diff --git a/src/main/resources/scenes/racepane.fxml b/src/main/resources/scenes/racepane.fxml index 9803ca44..1c2146be 100644 --- a/src/main/resources/scenes/racepane.fxml +++ b/src/main/resources/scenes/racepane.fxml @@ -18,7 +18,9 @@ - + + + From 8bb2558b7e51e9c3d83e616d8796addf3f662419 Mon Sep 17 00:00:00 2001 From: David Wu Date: Fri, 17 Mar 2017 12:06:35 +1300 Subject: [PATCH 4/6] Timer is now in race loop -Timer is currently printing out -Later will implement so that it is displayed on gui #story [16] --- src/main/java/seng302/Controllers/RaceController.java | 5 ++--- src/main/java/seng302/Model/Race.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index eeea8f78..f8969044 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -99,7 +99,7 @@ public class RaceController extends Controller{ BoatInRace boat = new BoatInRace("NZ", 10000); BoatInRace[] boats = new BoatInRace[] {boat}; - Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(1, 1), 0); + Leg leg1 = new Leg("first leg", 80, new GPSCoordinate(0, 0), new GPSCoordinate(200, 280), 0); Leg[] legs = new Leg[] {leg1}; ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, this); @@ -135,8 +135,7 @@ public class RaceController extends Controller{ displayLine(startline1, startline2, Color.GREEN); //display wind direction arrow - specify origin point and angle - displayPoint(this.map.convertGPS(32.293771, -64.855242), Color.BLACK); - displayArrow(new GraphCoordinate(500, 20), 100); + displayArrow(new GraphCoordinate(500, 20), 0); diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index 8d8342a3..7fdbd6ad 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -63,10 +63,20 @@ public abstract class Race implements Runnable { long timeLoopStarted; long timeLoopEnded; + long minutes; + long currentTimeInSeconds; + long remainingSeconds; + while (finishingBoats.size() < startingBoats.length) { timeLoopStarted = System.currentTimeMillis(); totalTimeElapsed = System.currentTimeMillis() - timeRaceStarted; + long currentTime = System.currentTimeMillis() - timeRaceStarted; + currentTimeInSeconds = currentTime / 1000; + minutes = currentTimeInSeconds / 60; + remainingSeconds = currentTimeInSeconds % 60; + System.out.println(minutes + ":" + remainingSeconds); + for (BoatInRace boat : startingBoats) { updatePosition(boat, SLEEP_TIME); checkPosition(boat, totalTimeElapsed); From 15829628f2a942ca6536ed5567393a0d53964c40 Mon Sep 17 00:00:00 2001 From: Fan-Wu Yang Date: Fri, 17 Mar 2017 13:10:29 +1300 Subject: [PATCH 5/6] Fixed Map - Changed GPS Coordinate so that latitude and longitude were on the correct orientation - Map is now centered. #fix --- src/main/java/seng302/Model/ResizableRaceCanvas.java | 3 +-- src/main/java/seng302/RaceMap.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/seng302/Model/ResizableRaceCanvas.java b/src/main/java/seng302/Model/ResizableRaceCanvas.java index 35ac8018..25f728ea 100644 --- a/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -69,7 +69,7 @@ public class ResizableRaceCanvas extends Canvas { double width = getWidth(); double height = getHeight(); System.out.println("Race Map Canvas Width: "+ width + ", Height:" + height); - this.map = new RaceMap(32.321989, -64.873, 32.28, -64.831, (int)width, (int)height); + this.map = new RaceMap(32.320989, -64.863, 32.278, -64.821, (int)width, (int)height); if (map == null){ return; @@ -100,7 +100,6 @@ public class ResizableRaceCanvas extends Canvas { displayLine(startline1, startline2, Color.GREEN); //display wind direction arrow - specify origin point and angle - displayPoint(this.map.convertGPS(32.293771, -64.855242), Color.BLACK); displayArrow(new GraphCoordinate(500, 20), 100); } diff --git a/src/main/java/seng302/RaceMap.java b/src/main/java/seng302/RaceMap.java index 9d197f4b..7fe28aef 100644 --- a/src/main/java/seng302/RaceMap.java +++ b/src/main/java/seng302/RaceMap.java @@ -19,6 +19,6 @@ public class RaceMap { * @see GraphCoordinate */ public GraphCoordinate convertGPS(double lat, double lon) { - return new GraphCoordinate((int) (width * (lat - x1) / (x2 - x1)), (int) (height - (height * (lon - y1) / (y2 - y1)))); + return new GraphCoordinate((int) ((height * (lon - y1) / (y2 - y1))),(int) (width * (lat - x1) / (x2 - x1))); } } From b25389f212fe76b1aebf9c1fce63b8de3d702983 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Fri, 17 Mar 2017 13:29:33 +1300 Subject: [PATCH 6/6] Implemented list of boats in order of last feature passed. - Update controller every time boats pass a mark - Cleared info table to force update #story [15] --- .../seng302/Controllers/RaceController.java | 10 +++--- .../seng302/Model/ConstantVelocityRace.java | 5 +-- src/main/java/seng302/Model/Race.java | 35 ++++++++++--------- src/test/java/seng302/RaceTest.java | 6 ++-- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/src/main/java/seng302/Controllers/RaceController.java b/src/main/java/seng302/Controllers/RaceController.java index bfa52c03..d9929fc1 100644 --- a/src/main/java/seng302/Controllers/RaceController.java +++ b/src/main/java/seng302/Controllers/RaceController.java @@ -50,7 +50,8 @@ public class RaceController extends Controller{ private RaceMap map; public void updateInfoTable(Race race) { - boatInfoTable.setItems(FXCollections.observableArrayList(race.getFinishingBoats())); + boatInfoTable.getItems().clear(); + boatInfoTable.setItems(FXCollections.observableArrayList(race.getStartingBoats())); boatTeamColumn.setCellValueFactory(new PropertyValueFactory("Name")); boatMarkColumn.setCellValueFactory(new PropertyValueFactory("CurrentLeg")); @@ -70,10 +71,11 @@ public class RaceController extends Controller{ raceMap.draw(); canvasBase.getChildren().add(raceMap); - BoatInRace boat = new BoatInRace("NZ", 10000); + BoatInRace boat = new BoatInRace("NZ", 1000); BoatInRace[] boats = new BoatInRace[] {boat}; - Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(1, 1), 0); - Leg[] legs = new Leg[] {leg1}; + ArrayList legs = new ArrayList<>(); + legs.add(new Leg("Start", 1, new GPSCoordinate(0,0), new GPSCoordinate(1,1), 0)); + legs.add(new Leg("Mark", 1, new GPSCoordinate(0,0), new GPSCoordinate(1,1), 1)); ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, this); diff --git a/src/main/java/seng302/Model/ConstantVelocityRace.java b/src/main/java/seng302/Model/ConstantVelocityRace.java index c5526fc2..6c94677a 100644 --- a/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -4,6 +4,7 @@ import seng302.Controllers.RaceController; import seng302.GPSCoordinate; import seng302.GraphCoordinate; +import java.util.ArrayList; import java.util.concurrent.TimeUnit; /** @@ -18,11 +19,11 @@ public class ConstantVelocityRace extends Race { * @see Leg */ - public ConstantVelocityRace(BoatInRace[] startingBoats, Leg[] marks, RaceController controller) { + public ConstantVelocityRace(BoatInRace[] startingBoats, ArrayList marks, RaceController controller) { super(startingBoats, marks, controller); } - public ConstantVelocityRace(BoatInRace[] startingBoats, Leg[] marks) { + public ConstantVelocityRace(BoatInRace[] startingBoats, ArrayList marks) { super(startingBoats, marks); } diff --git a/src/main/java/seng302/Model/Race.java b/src/main/java/seng302/Model/Race.java index 8d8342a3..d8bd57dd 100644 --- a/src/main/java/seng302/Model/Race.java +++ b/src/main/java/seng302/Model/Race.java @@ -12,9 +12,9 @@ import java.util.*; */ public abstract class Race implements Runnable { protected BoatInRace[] startingBoats; - protected ArrayList finishingBoats = new ArrayList<>(); - protected Leg[] legs; + protected ArrayList legs; protected RaceController controller; + protected int boatsFinished = 0; private int SLEEP_TIME = 1000; //time in milliseconds to pause in a paced loop @@ -23,22 +23,21 @@ public abstract class Race implements Runnable { * @param boats Takes in an array of boats that are participating in the race. * @param marks Number of marks in order that the boats pass in order to complete the race. */ - public Race(BoatInRace[] boats, Leg[] marks, RaceController controller) { + public Race(BoatInRace[] boats, ArrayList marks, RaceController controller) { this.startingBoats = boats; this.legs = marks; + this.legs.add(new Leg("Finish")); this.controller = controller; } - public Race(BoatInRace[] boats, Leg[] marks) { - this.startingBoats = boats; - this.legs = marks; + public Race(BoatInRace[] boats, ArrayList marks) { + this(boats, marks, null); } public void run() { - long time = System.currentTimeMillis(); + updateController(); preRace(); simulateRace(); - if(controller != null) controller.updateInfoTable(this); } private void preRace() { @@ -47,7 +46,7 @@ public abstract class Race implements Runnable { System.out.println("===================="); for (int i = 0; i < startingBoats.length; i++) { System.out.println(i + 1 + ". " + startingBoats[i].getName() + ", Speed: " + Math.round(startingBoats[i].getVelocity() * 1.94384) + "kn"); - startingBoats[i].setCurrentLeg(legs[0]); + startingBoats[i].setCurrentLeg(legs.get(0)); } } @@ -64,7 +63,7 @@ public abstract class Race implements Runnable { long timeLoopStarted; long timeLoopEnded; - while (finishingBoats.size() < startingBoats.length) { + while (boatsFinished < startingBoats.length) { timeLoopStarted = System.currentTimeMillis(); totalTimeElapsed = System.currentTimeMillis() - timeRaceStarted; for (BoatInRace boat : startingBoats) { @@ -83,27 +82,29 @@ public abstract class Race implements Runnable { protected void checkPosition(BoatInRace boat, long timeElapsed) { - if (boat.getDistanceTravelledInLeg() > boat.getCurrentLeg().getDistance()){ + updateController(); //boat has passed onto new leg - if (boat.getCurrentLeg().getLegNumber() == legs.length - 1) { + if (boat.getCurrentLeg().getName().equals("Finish")) { //boat has finished boat.setTimeFinished(timeElapsed); - boat.setCurrentLeg(new Leg("Finish")); - finishingBoats.add(boat); + boatsFinished++; } else { boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); - Leg nextLeg = legs[boat.getCurrentLeg().getLegNumber() + 1]; + Leg nextLeg = legs.get(boat.getCurrentLeg().getLegNumber() + 1); boat.setCurrentLeg(nextLeg); boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg()); } } + } + protected void updateController() { + if(controller != null) controller.updateInfoTable(this); } - public ArrayList getFinishingBoats() { - return finishingBoats; + public BoatInRace[] getStartingBoats() { + return startingBoats; } /** diff --git a/src/test/java/seng302/RaceTest.java b/src/test/java/seng302/RaceTest.java index fefba045..542c2ea8 100644 --- a/src/test/java/seng302/RaceTest.java +++ b/src/test/java/seng302/RaceTest.java @@ -5,6 +5,8 @@ import seng302.Model.BoatInRace; import seng302.Model.ConstantVelocityRace; import seng302.Model.Leg; +import java.util.ArrayList; + /** * Created by esa46 on 15/03/17. */ @@ -16,8 +18,8 @@ public class RaceTest { BoatInRace boat = new BoatInRace("NZ", 240); BoatInRace[] boats = new BoatInRace[] {boat}; - Leg leg1 = new Leg("first leg", 1, new GPSCoordinate(0, 0), new GPSCoordinate(3, 4), 0); - Leg[] legs = new Leg[] {leg1}; + ArrayList legs = new ArrayList<>(); + legs.add(new Leg("Start", 1, new GPSCoordinate(0,0), new GPSCoordinate(1,1), 0)); ConstantVelocityRace race = new ConstantVelocityRace(boats, legs); race.run(); }