From e72ac1def8738b5a0aa6e4f7b14526d409a8b001 Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Thu, 25 May 2017 13:48:48 +1200 Subject: [PATCH] Laylines are now togglable. Still not completely fool proof Laylines appear only for the selected boat. The dissapear if the boat is not seleccted. Laylines are the colour of the boat Laylines do not yet automatically update for a selected boat when it passes a mark There is still a polling interval of a second in which if you select a boat after it has just passed a mark it still thinks the next mark is that mark and laylines are displayed incorrectly #story[956] #pair[wmu16, mra106] --- .../controllers/RaceViewController.java | 54 +++++++++++++++++-- src/main/java/seng302/models/BoatGroup.java | 13 +++++ .../java/seng302/models/mark/MarkGroup.java | 40 ++++++-------- 3 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/main/java/seng302/controllers/RaceViewController.java b/src/main/java/seng302/controllers/RaceViewController.java index 8e7d730b..45041553 100644 --- a/src/main/java/seng302/controllers/RaceViewController.java +++ b/src/main/java/seng302/controllers/RaceViewController.java @@ -22,6 +22,7 @@ import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; +import javafx.scene.shape.Line; import javafx.scene.text.Text; import javafx.stage.Stage; import javafx.stage.StageStyle; @@ -259,6 +260,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel color = yacht.getColour(); } } + if (color == null){ + return String.format( "#%02X%02X%02X",255,255,255); + } return String.format( "#%02X%02X%02X", (int)( color.getRed() * 255 ), (int)( color.getGreen() * 255 ), @@ -427,6 +431,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } for(MarkGroup mg : includedCanvasController.getMarkGroups()) { + + mg.removeLaylines(); + if (mg.getMainMark().getId() == nextMark.getId()) { SingleMark singleMark1 = ((GateMark) nextMark).getSingleMark1(); @@ -446,14 +453,25 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel Point2D boatCurrentPos = new Point2D(bg.getBoatLayoutX(), bg.getBoatLayoutY()); Point2D gateMidPoint = markPoint1.midpoint(markPoint2); Integer lineFuncResult = GeometryUtils.lineFunction(boatCurrentPos, gateMidPoint, markPoint2); + Line rightLayline = new Line(); + Line leftLayline = new Line(); if (lineFuncResult == 1) { - mg.addRightLayline(markPoint2, 180 - resultingAngle, StreamParser.getWindDirection()); - mg.addLeftLayline(markPoint1, 180 - resultingAngle, StreamParser.getWindDirection()); + rightLayline = makeRightLayline(markPoint2, 180 - resultingAngle, StreamParser.getWindDirection()); + leftLayline = makeLeftLayline(markPoint1, 180 - resultingAngle, StreamParser.getWindDirection()); } else if (lineFuncResult == -1) { - mg.addRightLayline(markPoint1, 180 - resultingAngle, StreamParser.getWindDirection()); - mg.addLeftLayline(markPoint2, 180 - resultingAngle, StreamParser.getWindDirection()); + rightLayline = makeRightLayline(markPoint1, 180 - resultingAngle, StreamParser.getWindDirection()); + leftLayline = makeLeftLayline(markPoint2, 180 - resultingAngle, StreamParser.getWindDirection()); } + leftLayline.setStrokeWidth(0.5); + leftLayline.setStroke(bg.getBoat().getColour()); + + rightLayline.setStrokeWidth(0.5); + rightLayline.setStroke(bg.getBoat().getColour()); + + bg.setLaylines(leftLayline, rightLayline); + mg.addLaylines(leftLayline, rightLayline); + } } } @@ -463,6 +481,32 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } + private Point2D getPointRotation(Point2D ref, Double distance, Double angle){ + Double newX = ref.getX() + (ref.getX() + distance -ref.getX())*Math.cos(angle) - (ref.getY() + distance -ref.getY())*Math.sin(angle); + Double newY = ref.getY() + (ref.getX() + distance -ref.getX())*Math.sin(angle) + (ref.getY() + distance -ref.getY())*Math.cos(angle); + + return new Point2D(newX, newY); + } + + + public Line makeLeftLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { + + Point2D ep = getPointRotation(startPoint, 50.0, baseAngle + layLineAngle); + Line line = new Line(startPoint.getX(), startPoint.getY(), ep.getX(), ep.getY()); + return line; + + } + + + public Line makeRightLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { + + Point2D ep = getPointRotation(startPoint, 50.0, baseAngle - layLineAngle); + Line line = new Line(startPoint.getX(), startPoint.getY(), ep.getX(), ep.getY()); + return line; + + } + + /** * Initialised the combo box with any boats currently in the race and adds the required listener * for the combobox to take action upon selection @@ -623,9 +667,9 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel //We need to iterate over all race groups to get the matching boat group belonging to this boat if we //are to toggle its annotations, there is no other backwards knowledge of a yacht to its boatgroup. if (bg.getBoat().getHullID().equals(yacht.getHullID())) { + updateLaylines(bg); bg.setIsSelected(true); selectedBoat = yacht; - updateLaylines(bg); } else { bg.setIsSelected(false); } diff --git a/src/main/java/seng302/models/BoatGroup.java b/src/main/java/seng302/models/BoatGroup.java index d515f81b..6784550b 100644 --- a/src/main/java/seng302/models/BoatGroup.java +++ b/src/main/java/seng302/models/BoatGroup.java @@ -1,5 +1,6 @@ package seng302.models; +import java.util.ArrayList; import javafx.event.EventHandler; import javafx.geometry.Point2D; import javafx.scene.CacheHint; @@ -452,6 +453,18 @@ public class BoatGroup extends Group { rightLayline.setVisible(visible); } + public void setLaylines(Line line1, Line line2) { + this.leftLayLine = line1; + this.rightLayline = line2; + } + + public ArrayList getLaylines() { + ArrayList laylines = new ArrayList<>(); + laylines.add(leftLayLine); + laylines.add(rightLayline); + return laylines; + } + public Yacht getBoat() { return boat; } diff --git a/src/main/java/seng302/models/mark/MarkGroup.java b/src/main/java/seng302/models/mark/MarkGroup.java index 553197a1..011154a6 100644 --- a/src/main/java/seng302/models/mark/MarkGroup.java +++ b/src/main/java/seng302/models/mark/MarkGroup.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import javafx.geometry.Point2D; import javafx.scene.Group; +import javafx.scene.Node; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; @@ -46,34 +47,27 @@ public class MarkGroup extends Group { super.getChildren().add(markCircle); } - private Point2D getPointRotation(Point2D ref, Double distance, Double angle){ - Double newX = ref.getX() + (ref.getX() + distance -ref.getX())*Math.cos(angle) - (ref.getY() + distance -ref.getY())*Math.sin(angle); - Double newY = ref.getY() + (ref.getX() + distance -ref.getX())*Math.sin(angle) + (ref.getY() + distance -ref.getY())*Math.cos(angle); + public void addLaylines(Line line1, Line line2) { - return new Point2D(newX, newY); + super.getChildren().addAll(line1, line2); } - public void addLeftLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { - - Point2D ep = getPointRotation(startPoint, 50.0, baseAngle + layLineAngle); - Line line = new Line(startPoint.getX(), startPoint.getY(), ep.getX(), ep.getY()); - line.setStrokeWidth(1); - line.setStroke(Color.GREEN); - - super.getChildren().addAll(line); - - } - - public void addRightLayline(Point2D startPoint, Double layLineAngle, Double baseAngle) { - - Point2D ep = getPointRotation(startPoint, 50.0, baseAngle - layLineAngle); - Line line = new Line(startPoint.getX(), startPoint.getY(), ep.getX(), ep.getY()); - line.setStrokeWidth(1); - line.setStroke(Color.GREEN); - - super.getChildren().addAll(line); + public void removeLaylines() { + ArrayList toRemove = new ArrayList<>(); + for(Node node : super.getChildren()) { + if (node instanceof Line) { + Line layLine = (Line) node; + /*** + * OOHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHhhh + */ + if (layLine.getStrokeWidth() == 0.5){ + toRemove.add(layLine); + } + } + } + super.getChildren().removeAll(toRemove); } public MarkGroup(GateMark mark, Point2D points1, Point2D points2) {