diff --git a/doc/examples/course.xml b/doc/examples/course.xml index 49e17923..f8bfa00e 100644 --- a/doc/examples/course.xml +++ b/doc/examples/course.xml @@ -6,57 +6,57 @@ Start Start1 - 32.296038 - -64.854401 + 32.296577 + -64.854304 Start2 - 32.293834 - -64.855195 + 32.293771 + -64.855242 Mid Mark - 32.292881 - -64.843231 + 32.293039 + -64.843983 Leeward Gate Leeward Gate1 - 32.283808 - -64.850012 + 32.284680 + -64.850045 Leeward Gate2 - 32.283216 - -64.847686 + 32.280164 + -64.847591 Windward Gate Windward Gate1 - 32.309908 - -64.833665 + 32.309693 + -64.835249 Windward Gate2 - 32.309158 - -64.830834 + 32.308046 + -64.831785 Finish Finish1 - 32.318439 - -64.837367 + 32.317379 + -64.839291 Finish2 - 32.318303 - -64.834974 + 32.317257 + -64.836260 diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index db1e823e..b2dd4250 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -10,7 +10,7 @@ public class App extends Application { @Override public void start(Stage primaryStage) throws Exception { - Parent root = FXMLLoader.load(getClass().getResource("/RaceView.fxml")); + Parent root = FXMLLoader.load(getClass().getResource("/MainView.fxml")); primaryStage.setTitle("RaceVision"); primaryStage.setScene(new Scene(root)); diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index 19784df8..5ffa2a3c 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -7,8 +7,11 @@ import javafx.animation.Timeline; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.util.Duration; import seng302.models.Boat; @@ -20,12 +23,11 @@ import seng302.models.mark.Mark; import seng302.models.mark.MarkType; import seng302.models.mark.SingleMark; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import static java.lang.Math.abs; - /** * Created by ptg19 on 15/03/17. * Modified by Haoming Yin (hyi25) on 20/3/2017. @@ -35,12 +37,34 @@ public class CanvasController { private Race race; private GraphicsContext gc; private HashMap timelineInfos; + + private final double ORIGIN_LAT = 32.320504; + private final double ORIGIN_LON = -64.857063; + @FXML private Canvas canvas; + @FXML + private AnchorPane contentAnchorPane; + + @FXML + private RaceResultController raceResultController; + + private void setContentPane(String jfxUrl) { + try { + contentAnchorPane.getChildren().removeAll(); + contentAnchorPane.getChildren().clear(); + contentAnchorPane.getChildren().addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); + } catch (javafx.fxml.LoadException e) { + System.err.println(e.getCause()); + } catch (IOException e) { + System.err.println(e); + } + } + public void initialize() { gc = canvas.getGraphicsContext2D(); - gc.scale(22, 22); + gc.scale(15, 15); RaceController raceController = new RaceController(); raceController.initializeRace(); race = raceController.getRace(); @@ -53,7 +77,6 @@ public class CanvasController { gc.clearRect(0, 0, 760, 360); drawCourse(); drawBoats(); - } }; @@ -61,9 +84,37 @@ public class CanvasController { // starts the timer and reads events from each boat's time line timer.start(); + + int i = 0; + Double maxDuration = 0.0; + for (TimelineInfo timelineInfo : timelineInfos.values()) { + Timeline timeline = timelineInfo.getTimeline(); + System.out.println(); + + if (/*timeline.getTotalDuration().greaterThanOrEqualTo(maxDuration)*/ true){ + + } + + if (i == timelineInfos.values().size() - 1) { + timeline.setOnFinished(event -> { + setContentPane("/FinishView.fxml"); + + for (Boat boat : race.getFinishedBoats()) { + System.out.println(boat.getTeamName()); + } + + }); + System.out.println("B"); + } + else{ + System.out.println("A"); + } + timeline.play(); + + i++; } } @@ -82,12 +133,22 @@ public class CanvasController { List events = boat_events.get(boat); // iterates all events and convert each event to keyFrame, then add them into a list for (Event event : events) { - keyFrames.add( - new KeyFrame(Duration.seconds(event.getTime() / 60 / 60 / 5), - new KeyValue(x, event.getThisMark().getLatitude()), - new KeyValue(y, event.getThisMark().getLongitude()) - ) - ); + if (event.getIsFinishingEvent()) { + keyFrames.add( + new KeyFrame(Duration.seconds(event.getTime() / 60 / 60 / 5), + event1 -> race.setBoatFinished(boat), + new KeyValue(x, event.getThisMark().getLatitude()), + new KeyValue(y, event.getThisMark().getLongitude()) + ) + ); + } else { + keyFrames.add( + new KeyFrame(Duration.seconds(event.getTime() / 60 / 60 / 5), + new KeyValue(x, event.getThisMark().getLatitude()), + new KeyValue(y, event.getThisMark().getLongitude()) + ) + ); + } } // uses the lists generated above to create a Timeline for the boat. @@ -105,38 +166,20 @@ public class CanvasController { } } - /** - * @return the distance between the two marks - */ - public double getDistanceBetweenMarks(Mark mark1, Mark mark2) { - double earth_radius = 6378.137; - double dLat = mark2.getLatitude() * Math.PI / 180 - mark1.getLatitude() * Math.PI / 180; - double dLon = mark2.getLongitude() * Math.PI / 180 - mark1.getLongitude() * Math.PI / 180; - - double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(mark1.getLatitude() * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2); - - double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - double d = earth_radius * c; - - return d * 1000; - } - /** * Draws a boat with given (x, y) position in the given color * - * @param x - * @param y + * @param lat + * @param lon * @param color */ private void drawBoat(double lat, double lon, Color color) { // Latitude - //Double x = (MAP_WIDTH / 360.0) * (180 + lon); - //Double y = (MAP_HEIGHT / 180.0) * (80 - lat); - - double x = abs(lat - 32.283808) * 1000; // to prevent negative longitude - double y = abs(lon + 64.854401) * 1000; // to prevent negative latitude + double x = (lon - ORIGIN_LON) * 1000; + double y = (ORIGIN_LAT - lat) * 1000; double diameter = 0.5; + gc.setFill(color); gc.fillOval(x, y, diameter, diameter); } @@ -147,7 +190,7 @@ public class CanvasController { private void drawCourse() { for (Mark mark : race.getCourse()) { if (mark.getMarkType() == MarkType.SINGLE_MARK) { - drawSingleMark((SingleMark) mark); + drawSingleMark((SingleMark) mark, Color.BLACK); } else if (mark.getMarkType() == MarkType.GATE_MARK) { drawGateMark((GateMark) mark); } @@ -159,11 +202,11 @@ public class CanvasController { * * @param singleMark */ - private void drawSingleMark(SingleMark singleMark) { - double x = abs(singleMark.getLatitude() - 32.283808) * 1000; // to prevent negative longitude - double y = abs(singleMark.getLongitude() + 64.854401) * 1000; // to prevent negative latitude + private void drawSingleMark(SingleMark singleMark, Color color) { + double x = (singleMark.getLongitude() - ORIGIN_LON) * 1000; + double y = (ORIGIN_LAT - singleMark.getLatitude()) * 1000; - gc.setFill(Color.BLACK); + gc.setFill(color); gc.fillOval(x, y, 0.5, 0.5); } @@ -173,7 +216,28 @@ public class CanvasController { * @param gateMark */ private void drawGateMark(GateMark gateMark) { - drawSingleMark(gateMark.getSingleMark1()); - drawSingleMark(gateMark.getSingleMark2()); + Color color = Color.BLUE; + + if (gateMark.getName().equals("Start") || gateMark.getName().equals("Finish")){ + color = Color.RED; + } + + drawSingleMark(gateMark.getSingleMark1(), color); + drawSingleMark(gateMark.getSingleMark2(), color); + + GraphicsContext gc = canvas.getGraphicsContext2D(); + + gc.setStroke(color); + + //@todo Put this in Mark class + double x1 = (gateMark.getSingleMark1().getLongitude()- ORIGIN_LON) * 1000; + double y1 = (ORIGIN_LAT - gateMark.getSingleMark1().getLatitude()) * 1000; + + double x2 = (gateMark.getSingleMark2().getLongitude() - ORIGIN_LON) * 1000; + double y2 = (ORIGIN_LAT - gateMark.getSingleMark2().getLatitude()) * 1000; + + gc.setLineWidth(0.1); + + gc.strokeLine(x1, y1, x2, y2); } -} +} \ No newline at end of file diff --git a/src/main/java/seng302/controllers/Controller.java b/src/main/java/seng302/controllers/Controller.java deleted file mode 100644 index 41fb6dc2..00000000 --- a/src/main/java/seng302/controllers/Controller.java +++ /dev/null @@ -1,18 +0,0 @@ -package seng302.controllers; - -import javafx.fxml.FXML; -import javafx.scene.Parent; -import javafx.scene.layout.AnchorPane; - -/** - * Created by ptg19 on 20/03/17. - */ -public class Controller { - @FXML private AnchorPane window; - @FXML private Parent raceView; - @FXML private RaceController raceViewController; - - //^ this is automatic fxml linking based off http://blog.buildpath.de/fxml-composition-how-to-get-the-controller-of-an-included-fxml-view-nested-controllers/ - // From googling it's probably better to just add a child however you did that in your 301 michael, it kinda depends on how we are going to - // make an event for changing the screen. -} diff --git a/src/main/java/seng302/controllers/MasterViewController.java b/src/main/java/seng302/controllers/MasterViewController.java new file mode 100644 index 00000000..72de0419 --- /dev/null +++ b/src/main/java/seng302/controllers/MasterViewController.java @@ -0,0 +1,38 @@ +package seng302.controllers; + +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Pane; + +import java.io.IOException; +import java.net.URL; +import java.util.ResourceBundle; + +/** + * Created by michaelrausch on 21/03/17. + */ +public class MasterViewController implements Initializable { + @FXML + private AnchorPane contentPane; + + private void setContentPane(String jfxUrl){ + try{ + contentPane.getChildren().removeAll(); + contentPane.getChildren().clear(); + contentPane.getChildren().addAll((Pane) FXMLLoader.load(getClass().getResource(jfxUrl))); + } + catch(javafx.fxml.LoadException e){ + System.err.println(e.getCause()); + } + catch(IOException e){ + System.err.println(e); + } + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + setContentPane("/RaceView.fxml"); + } +} diff --git a/src/main/java/seng302/controllers/RaceController.java b/src/main/java/seng302/controllers/RaceController.java index 11f3a318..fa5d89f0 100644 --- a/src/main/java/seng302/controllers/RaceController.java +++ b/src/main/java/seng302/controllers/RaceController.java @@ -2,9 +2,8 @@ package seng302.controllers; import seng302.models.Boat; import seng302.models.OldFileParser; -import seng302.models.parsers.*; -import seng302.models.mark.*; import seng302.models.Race; +import seng302.models.parsers.CourseParser; import java.io.FileNotFoundException; import java.lang.reflect.Array; @@ -20,6 +19,7 @@ import java.util.Random; */ public class RaceController { Race race = null; + public void initializeRace() { String raceConfigFile; raceConfigFile = "doc/examples/config.json"; diff --git a/src/main/java/seng302/controllers/RaceResultController.java b/src/main/java/seng302/controllers/RaceResultController.java new file mode 100644 index 00000000..ce0fc868 --- /dev/null +++ b/src/main/java/seng302/controllers/RaceResultController.java @@ -0,0 +1,27 @@ +package seng302.controllers; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.layout.AnchorPane; + +import java.net.URL; +import java.util.ResourceBundle; + +/** + * Created by ptg19 on 20/03/17. + */ +public class RaceResultController implements Initializable{ + @FXML private AnchorPane window; + @FXML private Parent raceView; + @FXML private RaceController raceViewController; + + public void setResults(){ + System.out.println("HI MOM"); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + + } +} diff --git a/src/main/java/seng302/models/Event.java b/src/main/java/seng302/models/Event.java index 51eb814c..00a2b8bd 100644 --- a/src/main/java/seng302/models/Event.java +++ b/src/main/java/seng302/models/Event.java @@ -1,7 +1,6 @@ package seng302.models; import seng302.models.mark.Mark; -import seng302.models.mark.SingleMark; import java.text.SimpleDateFormat; import java.util.Date; @@ -40,7 +39,7 @@ public class Event { * @param eventTime, what time the event happens * @param eventBoat, the boat that the event belongs to */ - public Event(Double eventTime, Boat eventBoat, SingleMark mark1) { + public Event(Double eventTime, Boat eventBoat, Mark mark1) { this.time = eventTime; this.boat = eventBoat; this.mark1 = mark1; diff --git a/src/main/java/seng302/models/Race.java b/src/main/java/seng302/models/Race.java index ab036664..8ac21386 100644 --- a/src/main/java/seng302/models/Race.java +++ b/src/main/java/seng302/models/Race.java @@ -104,8 +104,9 @@ public class Race { // There are no more marks after this event else{ - Event event = new Event(time, boat, course.get(i), course.get(i)); + Event event = new Event(time, boat, course.get(i)); events.get(boat).add(event); + } } } @@ -132,4 +133,8 @@ public class Race { public HashMap getEvents() { return events; } + + public void setBoatFinished(Boat boat){ + this.finishingOrder.add(boat); + } } \ No newline at end of file diff --git a/src/main/java/seng302/models/mark/GateMark.java b/src/main/java/seng302/models/mark/GateMark.java index 208d2416..edf4f4ec 100644 --- a/src/main/java/seng302/models/mark/GateMark.java +++ b/src/main/java/seng302/models/mark/GateMark.java @@ -37,4 +37,12 @@ public class GateMark extends Mark { public void setSingleMark2(SingleMark singleMark2) { this.singleMark2 = singleMark2; } + + public double getLatitude(){ + return (this.getSingleMark1().getLatitude() + this.getSingleMark2().getLatitude()) / 2; + } + + public double getLongitude(){ + return (this.getSingleMark1().getLongitude() + this.getSingleMark2().getLongitude()) / 2; + } } diff --git a/src/main/resources/FinishView.fxml b/src/main/resources/FinishView.fxml index bdf28013..ba9e3d51 100644 --- a/src/main/resources/FinishView.fxml +++ b/src/main/resources/FinishView.fxml @@ -5,8 +5,7 @@ - - + @@ -22,13 +21,13 @@ - + - - + + diff --git a/src/main/resources/MainView.fxml b/src/main/resources/MainView.fxml index cc35fba2..1b4784a5 100644 --- a/src/main/resources/MainView.fxml +++ b/src/main/resources/MainView.fxml @@ -5,8 +5,8 @@ - + - + diff --git a/src/main/resources/RaceView.fxml b/src/main/resources/RaceView.fxml index e7538f07..002963fd 100644 --- a/src/main/resources/RaceView.fxml +++ b/src/main/resources/RaceView.fxml @@ -6,7 +6,7 @@ - +