Sails are displayed on first boat in a race. Optimised imports.

- Implemented drawSails method
- Sail position is displayed and updated using a boat's heading
- Sails conform to 'Points of sail'
- Javadoc'd new method and tidied up existing
- Sped up track point frequency (visualiserBoat class)
- Optimised imports (any other classes changed)
- A lot of canvas drawing and sail rotating issues were discovered and eventually overcome along the way. Using a sail image to draw and rotate on the existing canvas rather than a JavaFX shape on a new canvas was the final decision.

#story[1098]
main
Jessica Syder 9 years ago
parent 2a5d0938ff
commit 7c5670f8c2

@ -3,18 +3,14 @@ package mock.app;
import network.Messages.Enums.XMLMessageType; import network.Messages.Enums.XMLMessageType;
import network.Messages.LatestMessages; import network.Messages.LatestMessages;
import network.Messages.XMLMessage; import network.Messages.XMLMessage;
import org.mockito.Mock;
import visualiser.gameController.ControllerServer; import visualiser.gameController.ControllerServer;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Array;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
/** /**

@ -1,17 +1,13 @@
package mock.app; package mock.app;
import network.BinaryMessageEncoder; import network.BinaryMessageEncoder;
import network.MessageEncoders.RaceVisionByteEncoder; import network.MessageEncoders.RaceVisionByteEncoder;
import network.Messages.*; import network.Messages.*;
import network.Messages.Enums.MessageType; import network.Messages.Enums.MessageType;
import network.Messages.Enums.XMLMessageType;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException; import java.net.SocketException;
/** /**

@ -4,18 +4,17 @@ import javafx.animation.AnimationTimer;
import network.Messages.BoatLocation; import network.Messages.BoatLocation;
import network.Messages.BoatStatus; import network.Messages.BoatStatus;
import network.Messages.Enums.BoatStatusEnum; import network.Messages.Enums.BoatStatusEnum;
import network.Messages.Enums.RaceStatusEnum;
import network.Messages.LatestMessages; import network.Messages.LatestMessages;
import network.Messages.RaceStatus; import network.Messages.RaceStatus;
import network.Utils.AC35UnitConverter; import network.Utils.AC35UnitConverter;
import shared.dataInput.BoatDataSource; import shared.dataInput.BoatDataSource;
import shared.dataInput.RaceDataSource; import shared.dataInput.RaceDataSource;
import network.Messages.Enums.RaceStatusEnum;
import shared.dataInput.RegattaDataSource; import shared.dataInput.RegattaDataSource;
import shared.model.*; import shared.model.*;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.*; import java.util.*;
import static java.lang.Math.cos; import static java.lang.Math.cos;

@ -5,12 +5,14 @@ import network.Exceptions.InvalidMessageException;
import network.MessageDecoders.*; import network.MessageDecoders.*;
import network.Messages.*; import network.Messages.*;
import network.Messages.Enums.MessageType; import network.Messages.Enums.MessageType;
import static network.Utils.ByteConverter.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Arrays; import java.util.Arrays;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import static network.Utils.ByteConverter.bytesToInt;
import static network.Utils.ByteConverter.bytesToLong;
/** /**
* This class can be used to decode/convert a byte array into a messageBody object, descended from AC35Data. * This class can be used to decode/convert a byte array into a messageBody object, descended from AC35Data.
*/ */

@ -1,13 +1,13 @@
package network; package network;
import network.Messages.Enums.MessageType; import network.Messages.Enums.MessageType;
import static network.Utils.ByteConverter.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import static network.Utils.ByteConverter.*;
/** /**
* This class can be used to encode/convert a byte array message body, plus header data into a byte array containing the entire message, ready to send. * This class can be used to encode/convert a byte array message body, plus header data into a byte array containing the entire message, ready to send.

@ -2,8 +2,6 @@ package network.MessageDecoders;
import network.Messages.Enums.BoatActionEnum; import network.Messages.Enums.BoatActionEnum;
import java.util.Arrays;
public class BoatActionDecoder { public class BoatActionDecoder {
byte byteBoatAction; byte byteBoatAction;
BoatActionEnum boatAction; BoatActionEnum boatAction;

@ -5,9 +5,7 @@ import network.Messages.BoatLocation;
import java.util.Arrays; import java.util.Arrays;
import static network.Utils.ByteConverter.bytesToInt; import static network.Utils.ByteConverter.*;
import static network.Utils.ByteConverter.bytesToLong;
import static network.Utils.ByteConverter.bytesToShort;
/** /**

@ -6,9 +6,7 @@ import network.Messages.BoatStatus;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import static network.Utils.ByteConverter.bytesToInt; import static network.Utils.ByteConverter.*;
import static network.Utils.ByteConverter.bytesToLong;
import static network.Utils.ByteConverter.bytesToShort;
/** /**

@ -2,9 +2,6 @@ package network.MessageDecoders;
import network.Messages.Enums.XMLMessageType; import network.Messages.Enums.XMLMessageType;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays; import java.util.Arrays;
import static network.Utils.ByteConverter.bytesToLong; import static network.Utils.ByteConverter.bytesToLong;

@ -3,13 +3,14 @@ package network.MessageEncoders;
import network.Messages.*; import network.Messages.*;
import static network.Utils.ByteConverter.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static network.Utils.ByteConverter.intToBytes;
import static network.Utils.ByteConverter.longToBytes;
/** /**

@ -1,7 +1,6 @@
package network.Messages; package network.Messages;
import network.Messages.Enums.XMLMessageType; import network.Messages.Enums.XMLMessageType;
import shared.dataInput.RaceDataSource;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;

@ -4,7 +4,6 @@ package network.Messages;
import network.Messages.Enums.MessageType; import network.Messages.Enums.MessageType;
import network.Messages.Enums.XMLMessageType; import network.Messages.Enums.XMLMessageType;
import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
/** /**

@ -1,7 +1,6 @@
package shared.dataInput; package shared.dataInput;
import network.Messages.Enums.RaceTypeEnum; import network.Messages.Enums.RaceTypeEnum;
import shared.model.Boat;
import shared.model.CompoundMark; import shared.model.CompoundMark;
import shared.model.GPSCoordinate; import shared.model.GPSCoordinate;
import shared.model.Leg; import shared.model.Leg;

@ -8,7 +8,10 @@ import org.w3c.dom.NodeList;
import shared.enums.XMLFileType; import shared.enums.XMLFileType;
import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import shared.model.*; import shared.model.CompoundMark;
import shared.model.GPSCoordinate;
import shared.model.Leg;
import shared.model.Mark;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;

@ -2,15 +2,11 @@ package shared.dataInput;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import shared.dataInput.XMLReader;
import shared.enums.XMLFileType; import shared.enums.XMLFileType;
import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import shared.model.GPSCoordinate; import shared.model.GPSCoordinate;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
/** /**

@ -3,7 +3,6 @@ package shared.dataInput;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import shared.enums.XMLFileType; import shared.enums.XMLFileType;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;

@ -4,7 +4,6 @@ package visualiser.Controllers;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.property.Property; import javafx.beans.property.Property;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
@ -12,7 +11,6 @@ import javafx.scene.layout.StackPane;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
import shared.model.Bearing; import shared.model.Bearing;
import shared.model.Wind; import shared.model.Wind;
import visualiser.model.VisualiserRace;
/** /**
* Controller for the arrow.fxml view. * Controller for the arrow.fxml view.

@ -12,7 +12,6 @@ import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import visualiser.model.RaceConnection; import visualiser.model.RaceConnection;
import javax.xml.soap.Text;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.net.URL; import java.net.URL;

@ -1,21 +1,17 @@
package visualiser.Controllers; package visualiser.Controllers;
import javafx.application.Application;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.*; import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import mock.app.Event; import mock.app.Event;
import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidBoatDataException;
import shared.exceptions.InvalidRaceDataException; import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.InvalidRegattaDataException; import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import visualiser.model.RaceConnection;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.net.URL; import java.net.URL;
import java.net.UnknownHostException;
import java.util.ResourceBundle; import java.util.ResourceBundle;
/** /**

@ -7,7 +7,6 @@ import javafx.scene.control.Button;
import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView; import javafx.scene.control.TableView;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import visualiser.model.RaceConnection; import visualiser.model.RaceConnection;

@ -8,7 +8,6 @@ import javafx.collections.ObservableList;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.chart.LineChart; import javafx.scene.chart.LineChart;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.scene.control.Label;
import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;

@ -1,14 +1,9 @@
package visualiser.Controllers; package visualiser.Controllers;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.RadioButton; import javafx.scene.control.RadioButton;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import visualiser.app.App; import visualiser.app.App;
import java.io.IOException; import java.io.IOException;

@ -1,26 +1,14 @@
package visualiser.app; package visualiser.app;
import javafx.application.Platform;
import network.BinaryMessageDecoder; import network.BinaryMessageDecoder;
import network.Exceptions.InvalidMessageException; import network.Exceptions.InvalidMessageException;
import network.Messages.*; import network.Messages.*;
import org.xml.sax.SAXException;
import shared.dataInput.BoatXMLReader;
import shared.dataInput.RaceXMLReader;
import shared.dataInput.RegattaXMLReader;
import shared.exceptions.InvalidBoatDataException;
import shared.exceptions.InvalidRaceDataException;
import shared.exceptions.InvalidRegattaDataException;
import shared.exceptions.XMLReaderException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import static network.Utils.ByteConverter.bytesToShort; import static network.Utils.ByteConverter.bytesToShort;

@ -10,7 +10,6 @@ import visualiser.gameController.Keys.ControlKey;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.net.SocketException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
/** /**

@ -3,8 +3,6 @@ package visualiser.gameController;
import network.BinaryMessageDecoder; import network.BinaryMessageDecoder;
import network.MessageDecoders.BoatActionDecoder; import network.MessageDecoders.BoatActionDecoder;
import network.Messages.Enums.BoatActionEnum; import network.Messages.Enums.BoatActionEnum;
import visualiser.gameController.Keys.ControlKey;
import visualiser.gameController.Keys.KeyFactory;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.IOException; import java.io.IOException;

@ -7,8 +7,6 @@ import visualiser.gameController.Keys.KeyFactory;
import java.util.HashMap; import java.util.HashMap;
import static javafx.application.Application.launch;
/** /**
* Class for checking what keys are currently being used * Class for checking what keys are currently being used
*/ */

@ -1,7 +1,5 @@
package visualiser.gameController.Keys; package visualiser.gameController.Keys;
import javafx.scene.input.KeyCode;
/** /**
* Key for the controller, part of the abstract factory KeyFactory * Key for the controller, part of the abstract factory KeyFactory
*/ */

@ -1,7 +1,5 @@
package visualiser.gameController.Keys; package visualiser.gameController.Keys;
import javafx.scene.input.KeyCode;
/** /**
* Key to trigger auto VMG * Key to trigger auto VMG
*/ */

@ -1,7 +1,5 @@
package visualiser.gameController.Keys; package visualiser.gameController.Keys;
import javafx.scene.input.KeyCode;
/** /**
* key to zoom into the game * key to zoom into the game
*/ */

@ -1,8 +1,5 @@
package visualiser.model; package visualiser.model;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;

@ -3,10 +3,6 @@ package visualiser.model;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
/** /**
* Connection for Races * Connection for Races
*/ */

@ -1,7 +1,5 @@
package visualiser.model; package visualiser.model;
import javafx.scene.Node;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.scene.paint.Paint; import javafx.scene.paint.Paint;
@ -12,7 +10,6 @@ import shared.model.GPSCoordinate;
import shared.model.Mark; import shared.model.Mark;
import shared.model.RaceClock; import shared.model.RaceClock;
import java.time.Duration;
import java.util.List; import java.util.List;
/** /**
@ -29,23 +26,13 @@ import java.util.List;
*/ */
public class ResizableRaceCanvas extends ResizableCanvas { public class ResizableRaceCanvas extends ResizableCanvas {
/** private RaceMap map; // for converting GPSCoordinates to GraphCoordinates
* The RaceMap used for converting GPSCoordinates to GraphCoordinates. private VisualiserRace visualiserRace; // draw data read from this race
*/
private RaceMap map;
/**
* The race we read data from and draw.
*/
private VisualiserRace visualiserRace;
/**
* The background of the race.
* We render the background whenever the race boundary changes, or the screen size changes.
*/
private Image background; private Image background;
private Image sailsRight = new Image("/images/sailsRight.png");
private Image sailsLeft = new Image("/images/sailsLeft.png");
// annotations
private boolean annoName = true; private boolean annoName = true;
private boolean annoAbbrev = true; private boolean annoAbbrev = true;
private boolean annoSpeed = true; private boolean annoSpeed = true;
@ -53,15 +40,12 @@ public class ResizableRaceCanvas extends ResizableCanvas {
private boolean annoEstTime = true; private boolean annoEstTime = true;
private boolean annoTimeSinceLastMark = true; private boolean annoTimeSinceLastMark = true;
/** /**
* Constructs a {@link ResizableRaceCanvas} using a given {@link VisualiserRace}. * Constructs a {@link ResizableRaceCanvas} using a given {@link VisualiserRace}.
* @param visualiserRace The race that data is read from in order to be drawn. * @param visualiserRace The race that data is read from in order to be drawn.
*/ */
public ResizableRaceCanvas(VisualiserRace visualiserRace) { public ResizableRaceCanvas(VisualiserRace visualiserRace) {
super(); super();
this.visualiserRace = visualiserRace; this.visualiserRace = visualiserRace;
RaceDataSource raceData = visualiserRace.getRaceDataSource(); RaceDataSource raceData = visualiserRace.getRaceDataSource();
@ -72,14 +56,9 @@ public class ResizableRaceCanvas extends ResizableCanvas {
double long2 = raceData.getMapBottomRight().getLongitude(); double long2 = raceData.getMapBottomRight().getLongitude();
this.map = new RaceMap( this.map = new RaceMap(
lat1, long1, lat2, long2, lat1, long1, lat2, long2, (int)getWidth(), (int)getHeight());
(int) getWidth(), (int) getHeight() );
} }
/** /**
* Toggle name display in annotation * Toggle name display in annotation
*/ */
@ -119,11 +98,9 @@ public class ResizableRaceCanvas extends ResizableCanvas {
annoSpeed = !annoSpeed; annoSpeed = !annoSpeed;
} }
/** /**
* Rotates things on the canvas Note: this must be called in between gc.save() and gc.restore() else they will rotate everything * Rotates things displayed on the canvas. Note: this must be called in
* between gc.save() and gc.restore() else they will rotate everything
* *
* @param degrees Bearing degrees to rotate. * @param degrees Bearing degrees to rotate.
* @param px Pivot point x of rotation. * @param px Pivot point x of rotation.
@ -134,8 +111,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy()); gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy());
} }
/** /**
* Draws a circle with a given diameter, centred on a given graph coordinate. * Draws a circle with a given diameter, centred on a given graph coordinate.
* @param center The center coordinate of the circle. * @param center The center coordinate of the circle.
@ -147,8 +122,8 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.fillOval( gc.fillOval(
center.getX() - (diameter / 2), center.getX() - (diameter / 2),
center.getY() - (diameter / 2), center.getY() - (diameter / 2),
diameter, diameter ); diameter, diameter
);
} }
/** /**
@ -163,7 +138,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.setStroke(paint); gc.setStroke(paint);
gc.setFill(paint); gc.setFill(paint);
double endPointDiameter = 6; double endPointDiameter = 6;
//Draw first end-point. //Draw first end-point.
@ -177,8 +151,8 @@ public class ResizableRaceCanvas extends ResizableCanvas {
graphCoordinateA.getX(), graphCoordinateA.getX(),
graphCoordinateA.getY(), graphCoordinateA.getY(),
graphCoordinateB.getX(), graphCoordinateB.getX(),
graphCoordinateB.getY() ); graphCoordinateB.getY()
);
} }
/** /**
@ -198,7 +172,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
drawCircle(graphCoordinate, pointDiameter); drawCircle(graphCoordinate, pointDiameter);
} }
/** /**
* Display given name and speed of boat at a graph coordinate * Display given name and speed of boat at a graph coordinate
* *
@ -214,7 +187,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
//The text to draw. Built during the function. //The text to draw. Built during the function.
String text = ""; String text = "";
//Draw name if annotation is enabled. //Draw name if annotation is enabled.
if (annoName) { if (annoName) {
text += String.format("%s ", name); text += String.format("%s ", name);
@ -240,7 +212,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
text += timeSinceLastMark; text += timeSinceLastMark;
} }
//Offset by 20 pixels horizontally. //Offset by 20 pixels horizontally.
long xCoord = coordinate.getX() + 20; long xCoord = coordinate.getX() + 20;
long yCoord = coordinate.getY(); long yCoord = coordinate.getY();
@ -259,41 +230,36 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.fillText(text, xCoord, yCoord); gc.fillText(text, xCoord, yCoord);
} }
/** /**
* Draws the label for a given boat. Includes name, abbreviation, speed, time since mark, and time to next mark. * Draws the label for a given boat. Includes name, abbreviation, speed, time since mark, and time to next mark.
* @param boat The boat to draw text for. * @param boat The boat to draw text for.
*/ */
private void drawBoatText(VisualiserBoat boat) { private void drawBoatText(VisualiserBoat boat) {
drawText( drawText(
boat.getName(), boat.getName(),
boat.getCountry(), boat.getCountry(),
boat.getCurrentSpeed(), boat.getCurrentSpeed(),
this.map.convertGPS(boat.getCurrentPosition()), this.map.convertGPS(boat.getCurrentPosition()),
boat.getTimeToNextMarkFormatted(this.visualiserRace.getRaceClock().getCurrentTime()), boat.getTimeToNextMarkFormatted(this.visualiserRace.getRaceClock().getCurrentTime()),
boat.getTimeSinceLastMarkFormatted(this.visualiserRace.getRaceClock().getCurrentTime()) ); boat.getTimeSinceLastMarkFormatted(this.visualiserRace.getRaceClock().getCurrentTime())
);
} }
/** /**
* Draws all of the boats on the canvas. * Draws all of the boats on the canvas.
*/ */
private void drawBoats() { private void drawBoats() {
for (VisualiserBoat boat : visualiserRace.getBoats()) { for (VisualiserBoat boat : visualiserRace.getBoats()) {
//Draw track.
//Draw the boat. drawTrack(boat);
drawBoat(boat);
//Only draw wake if they are currently racing. //Only draw wake if they are currently racing.
if (boat.getStatus() == BoatStatusEnum.RACING) { if (boat.getStatus() == BoatStatusEnum.RACING) {
drawWake(boat); drawWake(boat);
} }
//Draw the boat.
drawBoat(boat);
//If the race hasn't started, we set the time since last mark to the current time, to ensure we don't start counting until the race actually starts. //If the race hasn't started, we set the time since last mark to the current time, to ensure we don't start counting until the race actually starts.
if ((boat.getStatus() != BoatStatusEnum.RACING) && (boat.getStatus() == BoatStatusEnum.FINISHED)) { if ((boat.getStatus() != BoatStatusEnum.RACING) && (boat.getStatus() == BoatStatusEnum.FINISHED)) {
@ -302,16 +268,9 @@ public class ResizableRaceCanvas extends ResizableCanvas {
//Draw boat label. //Draw boat label.
drawBoatText(boat); drawBoatText(boat);
//Draw track.
drawTrack(boat);
} }
} }
/** /**
* Draws a given boat on the canvas. * Draws a given boat on the canvas.
* @param boat The boat to draw. * @param boat The boat to draw.
@ -346,28 +305,66 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.fillPolygon(x, y, 3); gc.fillPolygon(x, y, 3);
gc.restore(); gc.restore();
// TODO: update with current players boat
if (boat.getSourceID() == 125) {
drawSails(boat);
}
} }
} }
/**
* Draws sails for a given boat on the canvas. Sail position is
* determined by the boats heading and the current wind direction
* according to the "points of sail".
* @param boat boat to display sails for
*/
private void drawSails(VisualiserBoat boat) {
GraphCoordinate boatPos =
this.map.convertGPS(boat.getCurrentPosition());
double xPos = boatPos.getX(); // x pos of sail (on boat)
double yPos = boatPos.getY() - 6; // y pos of sail (on boat)
double boatBearing = boat.getBearing().degrees();
double windDirection = visualiserRace.getWindDirection().degrees();
windDirection = 0; // set to 0 for now - will be removed
double sailRotateAngle; // required rotation for correct sail display
Image sailImage;
gc.save();
// right half of points of sail
if (boatBearing<180) {
sailImage = sailsRight;
sailRotateAngle = boatBearing * 0.5; // math
xPos -= 1; // right align to boat edge on canvas
// System.out.println("right side -- boat: " + boatBearing +
// "|| rotate: " + sailRotateAngle);
}
// left half of points of sail
else {
sailImage = sailsLeft;
sailRotateAngle = -(360 - boatBearing) * 0.5; // math
xPos -= 5; // left align to boat edge on canvas
// System.out.println("left side -- boat: " + boatBearing +
// "|| rotate: " + sailRotateAngle);
}
// rotate sails based on boats current heading
rotate(sailRotateAngle, boatPos.getX(), boatPos.getY());
gc.drawImage(sailImage, xPos, yPos);
gc.restore();
}
/** /**
* Draws the wake for a given boat. * Draws the wake for a given boat.
* @param boat Boat to draw wake for. * @param boat Boat to draw wake for.
*/ */
private void drawWake(VisualiserBoat boat) { private void drawWake(VisualiserBoat boat) {
// Calculate either end of wake line.
//Calculate either end of wake line.
GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition()); GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition());
GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake()); GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake());
//Draw.
drawLine(wakeFrom, wakeTo, boat.getColor()); drawLine(wakeFrom, wakeTo, boat.getColor());
} }
/** /**
* Draws all of the {@link Mark}s on the canvas. * Draws all of the {@link Mark}s on the canvas.
*/ */
@ -377,46 +374,30 @@ public class ResizableRaceCanvas extends ResizableCanvas {
} }
} }
/** /**
* Draws a given mark on the canvas. * Draws a given mark on the canvas.
* @param mark The mark to draw. * @param mark The mark to draw.
*/ */
private void drawMark(Mark mark) { private void drawMark(Mark mark) {
GraphCoordinate markToDraw = this.map.convertGPS(mark.getPosition());
//Calculate screen position. drawPoint(markToDraw, Color.LIMEGREEN);
GraphCoordinate mark1 = this.map.convertGPS(mark.getPosition());
//Draw.
drawPoint(mark1, Color.LIMEGREEN);
} }
/** /**
* Draws the Race Map. * Draws the Race Map.
* Called when the canvas is resized. * Called when the canvas is resized.
*/ */
public void draw() { public void draw() {
clear(); // clear previous canvas
//Clear canvas.
clear();
//Update our RaceMap using new canvas size. //Update our RaceMap using new canvas size.
this.map.setWidth((int) getWidth()); this.map.setWidth((int) getWidth());
this.map.setHeight((int) getHeight()); this.map.setHeight((int) getHeight());
//Redraw the boundary.
redrawBoundaryImage(); redrawBoundaryImage();
//Draw the race.
drawRace(); drawRace();
} }
/** /**
* Clears the canvas. * Clears the canvas.
*/ */
@ -424,19 +405,16 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.clearRect(0, 0, getWidth(), getHeight()); gc.clearRect(0, 0, getWidth(), getHeight());
} }
/** /**
* Draws the race boundary, and saves the image to {@link #background}. * Draws the race boundary, and saves the image to {@link #background}.
* You should call {@link #clear()} before calling this. * You should call {@link #clear()} before calling this.
*/ */
private void redrawBoundaryImage() { private void redrawBoundaryImage() {
//Prepare to draw. //Prepare to draw.
gc.setLineWidth(1); gc.setLineWidth(1);
gc.setFill(Color.AQUA); gc.setFill(Color.AQUA);
gc.drawImage(new Image(getClass().getClassLoader().getResourceAsStream("images/WaterBackground.png")), 0, 0); gc.drawImage(new Image(getClass().getClassLoader().getResourceAsStream("images/WaterBackground.png")), 0, 0);
//Calculate the screen coordinates of the boundary. //Calculate the screen coordinates of the boundary.
List<GPSCoordinate> boundary = this.visualiserRace.getBoundary(); List<GPSCoordinate> boundary = this.visualiserRace.getBoundary();
double[] xpoints = new double[boundary.size()]; double[] xpoints = new double[boundary.size()];
@ -456,7 +434,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
//Render boundary to image. //Render boundary to image.
this.background = snapshot(null, null); this.background = snapshot(null, null);
} }
/** /**
@ -464,23 +441,14 @@ public class ResizableRaceCanvas extends ResizableCanvas {
* Called once per frame, and on canvas resize. * Called once per frame, and on canvas resize.
*/ */
public void drawRace() { public void drawRace() {
gc.setLineWidth(2); gc.setLineWidth(2);
clear(); // clear the previous canvas
clear();
//Race boundary.
drawBoundary(); drawBoundary();
//Boats.
drawBoats(); drawBoats();
//Marks.
drawMarks(); drawMarks();
} }
/** /**
* Draws the race boundary image onto the canvas. * Draws the race boundary image onto the canvas.
* See {@link #background}. * See {@link #background}.
@ -489,13 +457,9 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.drawImage(this.background, 0, 0); gc.drawImage(this.background, 0, 0);
} }
/** /**
* Draws all track points for a given boat. Colour is set by boat, opacity by track point. * Draws all track points for a given boat. Colour is set by boat, opacity
* This checks if {@link #annoPath} is enabled. * by track point. This checks if {@link #annoPath} is enabled.
* @param boat The boat to draw tracks for. * @param boat The boat to draw tracks for.
* @see TrackPoint * @see TrackPoint
*/ */
@ -517,9 +481,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
gc.fillOval(scaledCoordinate.getX(), scaledCoordinate.getY(), point.getDiameter(), point.getDiameter()); gc.fillOval(scaledCoordinate.getX(), scaledCoordinate.getY(), point.getDiameter(), point.getDiameter());
} }
} }
} }
} }

@ -1,7 +1,5 @@
package visualiser.model; package visualiser.model;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import network.Messages.Enums.BoatStatusEnum; import network.Messages.Enums.BoatStatusEnum;
import shared.model.Azimuth; import shared.model.Azimuth;
@ -38,7 +36,7 @@ public class VisualiserBoat extends Boat {
/** /**
* The minimum period of time, in milliseconds, between the creation of each track point. * The minimum period of time, in milliseconds, between the creation of each track point.
*/ */
private static final long trackPointTimeInterval = 5000; private static final long trackPointTimeInterval = 500;
/** /**
* The number of track points that should be created before fully diminishing the alpha of a given track point. * The number of track points that should be created before fully diminishing the alpha of a given track point.

@ -16,7 +16,6 @@ import shared.dataInput.RegattaDataSource;
import shared.model.*; import shared.model.*;
import java.time.Duration; import java.time.Duration;
import java.time.ZonedDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

@ -1,18 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?> <?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?> <?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.*?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.shape.Circle?> <?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<GridPane fx:id="arrowGridPane" maxHeight="-Infinity" maxWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.ArrowController"> <GridPane fx:id="arrowGridPane" maxHeight="-Infinity" maxWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.ArrowController">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />

@ -1,12 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<AnchorPane fx:id="connectionWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" visible="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.ConnectionController"> <AnchorPane fx:id="connectionWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" visible="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.ConnectionController">
<children> <children>
<GridPane fx:id="connection" prefHeight="600.0" prefWidth="780.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <GridPane fx:id="connection" prefHeight="600.0" prefWidth="780.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">

@ -1,12 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?> <?import javafx.scene.control.Button?>
<?import javafx.scene.text.*?> <?import javafx.scene.control.Label?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<AnchorPane fx:id="hostWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" visible="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.HostController"> <AnchorPane fx:id="hostWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" visible="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.HostController">
<children> <children>
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">

@ -1,12 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<AnchorPane fx:id="lobbyWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" visible="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.LobbyController"> <AnchorPane fx:id="lobbyWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" visible="false" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.LobbyController">
<children> <children>
<GridPane fx:id="connection" prefHeight="600.0" prefWidth="780.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <GridPane fx:id="connection" prefHeight="600.0" prefWidth="780.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">

@ -1,9 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="main" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.MainController"> <AnchorPane fx:id="main" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.MainController">
<children> <children>
<fx:include fx:id="race" source="race.fxml" /> <fx:include fx:id="race" source="race.fxml" />

@ -1,12 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<AnchorPane fx:id="connectionWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.ConnectionController"> <AnchorPane fx:id="connectionWrapper" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="780.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.ConnectionController">
<children> <children>
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">

@ -1,20 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.RadioButton?>
<?import javafx.scene.image.*?> <?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?> <?import javafx.scene.text.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane fx:id="titleWrapper" maxHeight="600.0" maxWidth="800.0" minHeight="600.0" minWidth="800.0" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.TitleController"> <AnchorPane fx:id="titleWrapper" maxHeight="600.0" maxWidth="800.0" minHeight="600.0" minWidth="800.0" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="visualiser.Controllers.TitleController">
<children> <children>
<GridPane layoutY="39.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="800.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <GridPane layoutY="39.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="800.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">

@ -1,7 +1,5 @@
package mock.model; package mock.model;
import static org.junit.Assert.*;
public class MockBoatTest { public class MockBoatTest {
//TODO //TODO
} }

@ -1,7 +1,5 @@
package mock.model; package mock.model;
import static org.junit.Assert.*;
public class MockRaceTest { public class MockRaceTest {
//TODO //TODO
} }

@ -6,9 +6,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import shared.model.Bearing; import shared.model.Bearing;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/** /**

@ -4,7 +4,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import shared.model.Bearing; import shared.model.Bearing;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
public class VMGTest { public class VMGTest {

@ -13,9 +13,6 @@ import shared.dataInput.XMLReader;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;

@ -2,10 +2,7 @@ package network.Utils;
import org.junit.Test; import org.junit.Test;
import static network.Utils.AC35UnitConverter.convertGPS; import static network.Utils.AC35UnitConverter.*;
import static network.Utils.AC35UnitConverter.convertGPSToInt;
import static network.Utils.AC35UnitConverter.convertHeading;
import static network.Utils.AC35UnitConverter.convertTrueWindAngle;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
/** /**

@ -1,6 +1,5 @@
package network.Utils; package network.Utils;
import network.Utils.ByteConverter;
import org.junit.Test; import org.junit.Test;
import java.nio.ByteOrder; import java.nio.ByteOrder;

@ -9,9 +9,6 @@ import shared.dataInput.XMLReader;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;

@ -3,23 +3,17 @@ package shared.dataInput;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.xml.sax.SAXException;
import shared.enums.XMLFileType; import shared.enums.XMLFileType;
import shared.exceptions.InvalidBoatDataException; import shared.exceptions.InvalidBoatDataException;
import shared.exceptions.XMLReaderException; import shared.exceptions.XMLReaderException;
import shared.model.Boat; import shared.model.Boat;
import shared.model.Mark; import shared.model.Mark;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/** /**
* Created by cbt24 on 10/05/17. * Created by cbt24 on 10/05/17.

@ -1,7 +1,5 @@
package shared.model; package shared.model;
import static org.junit.Assert.*;
public class AngleTest { public class AngleTest {
//TODO //TODO
} }

@ -1,7 +1,5 @@
package shared.model; package shared.model;
import static org.junit.Assert.*;
public class AzimuthTest { public class AzimuthTest {
//TODO //TODO
} }

@ -1,7 +1,5 @@
package shared.model; package shared.model;
import static org.junit.Assert.*;
public class BearingTest { public class BearingTest {
//TODO //TODO
} }

@ -1,7 +1,6 @@
package shared.model; package shared.model;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;

@ -1,7 +1,5 @@
package shared.model; package shared.model;
import static org.junit.Assert.*;
public class MarkTest { public class MarkTest {
//TODO //TODO
} }

@ -1,7 +1,5 @@
package shared.model; package shared.model;
import static org.junit.Assert.*;
public class RaceClockTest { public class RaceClockTest {
//TODO //TODO
} }

@ -7,7 +7,6 @@ import javafx.scene.Scene;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.stage.WindowEvent; import javafx.stage.WindowEvent;
import visualiser.gameController.InputChecker;
/** /**
* Start to manually test the game controller * Start to manually test the game controller

@ -4,7 +4,6 @@ import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
/** /**

Loading…
Cancel
Save