From ef098e63d7394bb82b9e6cdb02a3dc7416a9dc5f Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Wed, 22 Mar 2017 12:51:03 +1300 Subject: [PATCH] Added finishing events #implement and rotated the map by 180 degrees#fix --- src/main/java/seng302/App.java | 2 +- .../seng302/controllers/CanvasController.java | 117 +++++++++++++----- .../java/seng302/controllers/Controller.java | 18 --- .../controllers/MasterViewController.java | 38 ++++++ .../seng302/controllers/RaceController.java | 4 +- .../controllers/RaceResultController.java | 27 ++++ src/main/java/seng302/models/Event.java | 3 +- src/main/java/seng302/models/Race.java | 7 +- src/main/resources/FinishView.fxml | 9 +- src/main/resources/MainView.fxml | 4 +- src/main/resources/RaceView.fxml | 2 +- 11 files changed, 168 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/seng302/controllers/Controller.java create mode 100644 src/main/java/seng302/controllers/MasterViewController.java create mode 100644 src/main/java/seng302/controllers/RaceResultController.java 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..936f4be0 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,6 +23,7 @@ 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; @@ -35,12 +39,31 @@ public class CanvasController { private Race race; private GraphicsContext gc; private HashMap timelineInfos; + @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 +76,6 @@ public class CanvasController { gc.clearRect(0, 0, 760, 360); drawCourse(); drawBoats(); - } }; @@ -61,9 +83,27 @@ public class CanvasController { // starts the timer and reads events from each boat's time line timer.start(); + + int i = 0; + for (TimelineInfo timelineInfo : timelineInfos.values()) { + Timeline timeline = timelineInfo.getTimeline(); + + if (i == timelineInfos.values().size() - 1) { + timeline.setOnFinished(event -> { + setContentPane("/FinishView.fxml"); + + for (Boat boat : race.getFinishedBoats()) { + System.out.println(boat.getTeamName()); + } + + }); + } + timeline.play(); + + i++; } } @@ -82,12 +122,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,36 +155,25 @@ 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 yLat = lon; + double yLon = 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 = abs(yLat - 32.283808) * 1000; // to prevent negative longitude + //double y = abs(yLon + 64.854401) * 1000; // to prevent negative latitude + + double y = abs(yLat + 64.854401) * 1000; // to prevent negative longitude + double x = abs(yLon - 32.283808) * 1000; // to prevent negative latitude double diameter = 0.5; gc.setFill(color); @@ -160,8 +199,24 @@ 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 + double yLat = singleMark.getLongitude(); + double yLon = singleMark.getLatitude(); + + //double yLat = singleMark.getLatitude(); + //double yLon = singleMark.getLongitude(); + + System.out.println(yLat); + System.out.println(yLon); + + //double x = abs(yLat - 32.283808) * 1000; // to prevent negative longitude + //double y = abs(yLon + 64.854401) * 1000; // to prevent negative latitude + + double x = abs(yLon - 32.283808) * 1000; // to prevent negative longitude + double y = abs(yLat + 64.854401) * 1000; // to prevent negative latitude + + System.out.println(x); + System.out.println(y); + System.out.println(); gc.setFill(Color.BLACK); gc.fillOval(x, y, 0.5, 0.5); @@ -176,4 +231,4 @@ public class CanvasController { drawSingleMark(gateMark.getSingleMark1()); drawSingleMark(gateMark.getSingleMark2()); } -} +} \ 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/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 @@ - +