Documented some RaceObject classes.

#documentation
This commit is contained in:
Calum
2017-05-01 14:30:41 +12:00
parent ec57851de2
commit 6a361c0d4b
4 changed files with 45 additions and 50 deletions
@@ -99,9 +99,6 @@ public class CanvasController {
fitMarksToCanvas(); fitMarksToCanvas();
drawBoats(); drawBoats();
timer = new AnimationTimer() { timer = new AnimationTimer() {
private int countdown = 60;
private int[] currentRaceMarker = {1, 1, 1, 1, 1, 1};
List<Mark> marks = raceViewController.getRace().getCourse();
@Override @Override
public void handle(long now) { public void handle(long now) {
@@ -118,14 +115,18 @@ public class CanvasController {
if (frameTimeIndex == 0) { if (frameTimeIndex == 0) {
arrayFilled = true ; arrayFilled = true ;
} }
long elapsedNanos;
if (arrayFilled) { if (arrayFilled) {
long elapsedNanos = now - oldFrameTime ; elapsedNanos = now - oldFrameTime ;
long elapsedNanosPerFrame = elapsedNanos / frameTimes.length ; long elapsedNanosPerFrame = elapsedNanos / frameTimes.length ;
Double frameRate = 1_000_000_000.0 / elapsedNanosPerFrame ; Double frameRate = 1_000_000_000.0 / elapsedNanosPerFrame ;
drawFps(frameRate.intValue()); drawFps(frameRate.intValue());
} }
// TODO: 1/05/17 cir27 - Make the RaceObjects update on the actual delay.
elapsedNanos = 1000 / 60;
System.out.println("elapsedNanos = " + elapsedNanos);
for (RaceObject raceObject : raceObjects) { for (RaceObject raceObject : raceObjects) {
raceObject.updatePosition(1000 / 60); raceObject.updatePosition(elapsedNanos);
for (int id : raceObject.getRaceIds()) { for (int id : raceObject.getRaceIds()) {
if (StreamParser.boatPositions.containsKey((long) id)) { if (StreamParser.boatPositions.containsKey((long) id)) {
Point3D p = StreamParser.boatPositions.get((long) id); Point3D p = StreamParser.boatPositions.get((long) id);
@@ -146,7 +147,7 @@ public class CanvasController {
class ResizableCanvas extends Canvas { class ResizableCanvas extends Canvas {
public ResizableCanvas() { ResizableCanvas() {
// Redraw canvas when size changes. // Redraw canvas when size changes.
widthProperty().addListener(evt -> draw()); widthProperty().addListener(evt -> draw());
heightProperty().addListener(evt -> draw()); heightProperty().addListener(evt -> draw());
@@ -203,39 +204,14 @@ public class CanvasController {
for (Boat boat : boats) { for (Boat boat : boats) {
BoatGroup boatGroup = new BoatGroup(boat, Colors.getColor()); BoatGroup boatGroup = new BoatGroup(boat, Colors.getColor());
boatGroup.moveTo(startingX, startingY, 0d); boatGroup.moveTo(startingX, startingY, 0d);
// boatGroup.setDestination(firstMarkX, firstMarkY);
boatGroup.forceRotation(); boatGroup.forceRotation();
//group.getChildren().add(boatGroup);
raceObjects.add(boatGroup); raceObjects.add(boatGroup);
boatAnnotations.getChildren().add(boatGroup.getLowPriorityAnnotations()); boatAnnotations.getChildren().add(boatGroup.getLowPriorityAnnotations());
// drawBoat(boat.getLongitude(), boat.getLatitude(), boat.getColor(), boat.getShortName(), boat.getSpeedInKnots(), boat.getHeading());
} }
group.getChildren().add(boatAnnotations); group.getChildren().add(boatAnnotations);
group.getChildren().addAll(raceObjects); group.getChildren().addAll(raceObjects);
} }
/**
* Inner class for creating point so that you can rotate it around origin point.
*/
class Point {
double x, y;
Point (double x, double y) {
this.x = x;
this.y = y;
}
void rotate(double angle) {
double oldX = x;
double oldY = y;
this.x = oldX * Math.cos(angle) - oldY * Math.sin(angle);
this.y = oldX * Math.sin(angle) + oldY * Math.cos(angle);
}
}
/** /**
* Calculates x and y location for every marker that fits it to the canvas the race will be drawn on. * Calculates x and y location for every marker that fits it to the canvas the race will be drawn on.
*/ */
+20 -2
View File
@@ -23,7 +23,6 @@ public class BoatGroup extends RaceObject{
private static final double BOAT_HEIGHT = 15d; private static final double BOAT_HEIGHT = 15d;
private static final double BOAT_WIDTH = 10d; private static final double BOAT_WIDTH = 10d;
private static final int LINE_INTERVAL = 30; private static final int LINE_INTERVAL = 30;
private static double expectedUpdateInterval = 200;
private double framesForNewLine = 0; private double framesForNewLine = 0;
private boolean destinationSet; private boolean destinationSet;
private Point2D lastPoint; private Point2D lastPoint;
@@ -56,6 +55,7 @@ public class BoatGroup extends RaceObject{
*/ */
public BoatGroup (Boat boat, Color color, double... points) public BoatGroup (Boat boat, Color color, double... points)
{ {
this.boat = boat;
initChildren(color, points); initChildren(color, points);
} }
@@ -143,7 +143,7 @@ public class BoatGroup extends RaceObject{
/** /**
* Updates the position of all graphics in the BoatGroup based off of the given time interval. * Updates the position of all graphics in the BoatGroup based off of the given time interval.
* @param timeInterval The interval, in microseconds, the boat should update it's position based on. * @param timeInterval The interval, in milliseconds, the boat should update it's position based on.
*/ */
public void updatePosition (long timeInterval) { public void updatePosition (long timeInterval) {
//Calculate the movement of the boat. //Calculate the movement of the boat.
@@ -249,6 +249,12 @@ public class BoatGroup extends RaceObject{
return boat; return boat;
} }
/**
* Returns true if this BoatGroup contains at least one of the given IDs.
*
* @param raceIds The ID's to check the BoatGroup for.
* @return True if the BoatGroup contains at east one of the given IDs, false otherwise.
*/
public boolean hasRaceId (int... raceIds) { public boolean hasRaceId (int... raceIds) {
for (int id : raceIds) { for (int id : raceIds) {
if (id == boat.getId()) if (id == boat.getId())
@@ -257,10 +263,22 @@ public class BoatGroup extends RaceObject{
return false; return false;
} }
/**
* Returns all raceIds associated with this group. For BoatGroups the ID's are for the boat.
*
* @return An array containing all ID's associated with this RaceObject.
*/
public int[] getRaceIds () { public int[] getRaceIds () {
return new int[] {boat.getId()}; return new int[] {boat.getId()};
} }
/**
* Due to javaFX limitations annotations associated with a boat that you want to appear below all boats in the
* Z-axis need to be pulled out of the BoatGroup and added to the parent group of the BoatGroups. This function
* returns these annotations as a group.
*
* @return A group containing low priority annotations.
*/
public Group getLowPriorityAnnotations () { public Group getLowPriorityAnnotations () {
Group group = new Group(); Group group = new Group();
group.getChildren().addAll(wake, lineGroup); group.getChildren().addAll(wake, lineGroup);
+17 -9
View File
@@ -18,8 +18,6 @@ public abstract class RaceObject extends Group {
protected double pixelVelocityX; protected double pixelVelocityX;
protected double pixelVelocityY; protected double pixelVelocityY;
static double max = 0;
public Point2D getPosition () { public Point2D getPosition () {
return new Point2D(super.getLayoutX(), getLayoutY()); return new Point2D(super.getLayoutX(), getLayoutY());
} }
@@ -28,10 +26,16 @@ public abstract class RaceObject extends Group {
return expectedUpdateInterval; return expectedUpdateInterval;
} }
/**
*
*/
public static void setExpectedUpdateInterval(double expectedUpdateInterval) { public static void setExpectedUpdateInterval(double expectedUpdateInterval) {
RaceObject.expectedUpdateInterval = expectedUpdateInterval; RaceObject.expectedUpdateInterval = expectedUpdateInterval;
} }
/**
* Calculates the rotational velocity required to reach the rotationalGoal from the currentRotation.
*/
protected void calculateRotationalVelocity () { protected void calculateRotationalVelocity () {
if (Math.abs(rotationalGoal - currentRotation) > 180) { if (Math.abs(rotationalGoal - currentRotation) > 180) {
if (rotationalGoal - currentRotation >= 0) { if (rotationalGoal - currentRotation >= 0) {
@@ -47,20 +51,24 @@ public abstract class RaceObject extends Group {
rotationalVelocity = 0; rotationalVelocity = 0;
rotateTo(rotationalGoal); rotateTo(rotationalGoal);
} }
// max = Math.max(max, Math.abs(rotationalVelocity));
// System.out.println("max = " + max);
} }
/** /**
* Sets the destination of everything within the RaceObject that has an ID in the array raceIds. The destination is * Sets the destination of everything within the RaceObject that has an ID in the array raceIds. The destination is
* set to the co-ordinates (x, y) with the given rotation. * set to the co-ordinates (x, y) with the given rotation.
* @param x * @param x X co-ordinate to move the graphics to.
* @param y * @param y Y co-ordinate to move the graphics to.
* @param rotation * @param rotation Rotation to move graphics to.
* @param raceIds * @param raceIds RaceID of the object to move.
*/ */
public abstract void setDestination (double x, double y, double rotation, int... raceIds); public abstract void setDestination (double x, double y, double rotation, int... raceIds);
/**
* Sets the destination of everything within the RaceObject that has an ID in the array raceIds. The destination is
* set to the co-ordinates (x, y).
* @param x X co-ordinate to move the graphic to.
* @param y Y co-ordinate to move the graphic to.
* @param raceIds RaceID to the object to move.
*/
public abstract void setDestination (double x, double y, int... raceIds); public abstract void setDestination (double x, double y, int... raceIds);
public abstract void updatePosition (long timeInterval); public abstract void updatePosition (long timeInterval);
-7
View File
@@ -21,8 +21,6 @@ class Wake extends Group {
private double[] rotations = new double[numWakes]; private double[] rotations = new double[numWakes];
private int[] velocityIndices = new int[numWakes]; private int[] velocityIndices = new int[numWakes];
private double sum = 0; private double sum = 0;
static double max = 0;
static double min = Double.MAX_VALUE;
/** /**
* Create a wake at the given location. * Create a wake at the given location.
@@ -54,17 +52,12 @@ class Wake extends Group {
rotationalVelocity = 0; rotationalVelocity = 0;
} }
sum -= Math.abs(velocities[(velocityIndices[0] + 10) % 13]); sum -= Math.abs(velocities[(velocityIndices[0] + 10) % 13]);
// sum -= Math.abs(velocities[velocityIndices[0]]);
sum += Math.abs(rotationalVelocity); sum += Math.abs(rotationalVelocity);
System.out.println("sum = " + sum); System.out.println("sum = " + sum);
if (sum < 0.9) if (sum < 0.9)
rotate (rotationGoal); //In relatively straight segments the wake snaps to match the boats current position. rotate (rotationGoal); //In relatively straight segments the wake snaps to match the boats current position.
//This stops the wake from eventually becoming out of sync with the boat. //This stops the wake from eventually becoming out of sync with the boat.
max = Math.max(max, sum);
min = Math.min(max, sum);
System.out.println("max = " + max);
System.out.println("min = " + min);
//Update the index of the array of recent velocities that each wake uses. Each wake is 3 velocities behind the //Update the index of the array of recent velocities that each wake uses. Each wake is 3 velocities behind the
//next smallest wake. //next smallest wake.
velocityIndices[0] = (13 + (velocityIndices[0] - 1) % 13) % 13; velocityIndices[0] = (13 + (velocityIndices[0] - 1) % 13) % 13;