diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index a1883304..41ae6ddf 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -53,8 +53,8 @@ public class CanvasController { private Mark minLonPoint; private Mark maxLatPoint; private Mark maxLonPoint; - private int referencePointX; - private int referencePointY; + private double referencePointX; + private double referencePointY; private double metersToPixels; public AnimationTimer timer; @@ -303,6 +303,13 @@ public class CanvasController { drawGateMark((GateMark) mark); } } + System.out.println("MIN/MAX POINTS"); + System.out.println(minLatPoint.getName() + " " + minLatPoint.getX() + " " + minLatPoint.getY()); + System.out.println(maxLatPoint.getName() + " " + maxLatPoint.getX() + " " + maxLatPoint.getY()); + System.out.println(minLonPoint.getName() + " " + minLonPoint.getX() + " " + minLonPoint.getY()); + System.out.println(maxLonPoint.getName() + " " + maxLonPoint.getX() + " " + maxLonPoint.getY()); + System.out.println(referencePointX); + System.out.println(referencePointY); } /** @@ -312,6 +319,7 @@ public class CanvasController { */ private void drawSingleMark(SingleMark singleMark, Color color) { gc.setFill(color); + System.out.println("DRAWING " + singleMark.getName() + " at " + singleMark.getX() + ", " + singleMark.getY()); gc.fillOval(singleMark.getX(), singleMark.getY(),MARK_SIZE,MARK_SIZE); } @@ -388,6 +396,16 @@ public class CanvasController { Collections.reverse(sortedPoints); minLonPoint = sortedPoints.get(0); maxLonPoint = sortedPoints.get(sortedPoints.size()-1); + System.out.println("ALL POINTS"); + for (Mark m : sortedPoints) + { + System.out.println(m.getName() + " " + m.getLatitude() + " " + m.getLongitude()); + } + System.out.println("MIN/MAX POINTS"); + System.out.println(minLatPoint.getName() + " " + minLatPoint.getLatitude() + " " + minLatPoint.getLongitude()); + System.out.println(maxLatPoint.getName() + " " + maxLatPoint.getLatitude() + " " + maxLatPoint.getLongitude()); + System.out.println(minLonPoint.getName() + " " + minLonPoint.getLatitude() + " " + minLonPoint.getLongitude()); + System.out.println(maxLonPoint.getName() + " " + maxLonPoint.getLatitude() + " " + maxLonPoint.getLongitude()); } /** @@ -399,33 +417,41 @@ public class CanvasController { private void calculateReferencePointLocation (double minLonToMaxLon) { Mark referencePoint = minLatPoint; double referenceAngle; - double mapWidth = canvas.getWidth(); - double mapHeight = canvas.getHeight(); + //double mapWidth = canvas.getWidth(); + //double mapHeight = canvas.getHeight(); if (scaleDirection == ScaleDirection.HORIZONTAL) { - referenceAngle = Mark.calculateHeadingRad(referencePoint, minLonPoint) - (Math.PI * (3/4)); - referencePointX = LHS_BUFFER + (int) Math.round(distanceScaleFactor * Math.cos(referenceAngle) * Mark.calculateDistance(referencePoint, minLonPoint)); + System.out.println("HORIZONTAL"); + System.out.println("ref angle " + Mark.calculateHeadingRad(referencePoint, minLonPoint)); + //referenceAngle = Mark.calculateHeadingRad(referencePoint, minLonPoint) - (Math.PI * (3/4)); + referenceAngle = Math.abs(Mark.calculateHeadingRad(referencePoint, minLonPoint)); + referencePointX = LHS_BUFFER + distanceScaleFactor * Math.sin(referenceAngle) * Mark.calculateDistance(referencePoint, minLonPoint); - referenceAngle = Mark.calculateHeadingRad(referencePoint, maxLatPoint); - if (referenceAngle > (Math.PI / 2)) { - referenceAngle = (Math.PI * 2) - referenceAngle; - } - referencePointY = (int) Math.round(mapHeight - (TOP_BUFFER + BOT_BUFFER)); - referencePointY -= (int) Math.round(distanceScaleFactor * Math.cos(referenceAngle) * Mark.calculateDistance(referencePoint, maxLatPoint)); - referencePointY = (int) Math.round(referencePointY / 2d); + //referenceAngle = Mark.calculateHeadingRad(referencePoint, maxLatPoint); + //if (referenceAngle > Math.PI) { + // referenceAngle = (Math.PI * 2) - referenceAngle; + //} + referenceAngle = Math.abs(Mark.calculateHeadingRad(referencePoint, maxLatPoint)); + referencePointY = CANVAS_HEIGHT - (TOP_BUFFER + BOT_BUFFER); + referencePointY -= distanceScaleFactor * Math.cos(referenceAngle) * Mark.calculateDistance(referencePoint, maxLatPoint); + referencePointY = referencePointY / 2; referencePointY += TOP_BUFFER; - referencePointY += (int) Math.round(distanceScaleFactor * Math.cos(referenceAngle) * Mark.calculateDistance(referencePoint, maxLatPoint)); + referencePointY += distanceScaleFactor * Math.cos(referenceAngle) * Mark.calculateDistance(referencePoint, maxLatPoint); } else { - referencePointY = (int) Math.round(mapHeight - BOT_BUFFER); + System.out.println("VERTICAL"); + referencePointY = CANVAS_HEIGHT - BOT_BUFFER; - referenceAngle = (Math.PI * 2) - Mark.calculateHeadingRad(referencePoint, minLonPoint); + //referenceAngle = (Math.PI * 2) - Mark.calculateHeadingRad(referencePoint, minLonPoint); + referenceAngle = Math.abs(Mark.calculateHeadingRad(referencePoint, minLonPoint)); referencePointX = LHS_BUFFER; - referencePointX += (int) Math.round(distanceScaleFactor * Math.sin(referenceAngle) * Mark.calculateDistance(referencePoint, minLonPoint)); - referencePointX += (int) Math.round(((mapWidth - (LHS_BUFFER + RHS_BUFFER)) - (minLonToMaxLon * distanceScaleFactor)) / 2); + referencePointX += distanceScaleFactor * Math.sin(referenceAngle) * Mark.calculateDistance(referencePoint, minLonPoint); + referencePointX += ((CANVAS_WIDTH - (LHS_BUFFER + RHS_BUFFER)) - (minLonToMaxLon * distanceScaleFactor)) / 2; } - referencePoint.setX(referencePointX); - referencePoint.setY(referencePointY); + referencePointX = Math.round(referencePointX); + referencePointY = Math.round(referencePointY); + referencePoint.setX((int) referencePointX); + referencePoint.setY((int) referencePointY); } /** @@ -433,9 +459,10 @@ public class CanvasController { * Returns the max horizontal distance of the map. */ private double scaleRaceExtremities () { - double vertAngle = Mark.calculateHeadingRad(minLatPoint, maxLatPoint); - if (vertAngle > Math.PI) - vertAngle = (2 * Math.PI) - vertAngle; + //double vertAngle = Mark.calculateHeadingRad(minLatPoint, maxLatPoint); + double vertAngle = Math.abs(Mark.calculateHeadingRad(minLatPoint, maxLatPoint)); +// if (vertAngle > Math.PI) +// vertAngle = (2 * Math.PI) - vertAngle; double vertDistance = Math.cos(vertAngle) * Mark.calculateDistance(minLatPoint, maxLatPoint); double horiAngle = Mark.calculateHeadingRad(minLonPoint, maxLonPoint); @@ -445,10 +472,10 @@ public class CanvasController { horiAngle = horiAngle - (Math.PI / 2); double horiDistance = Math.cos(horiAngle) * Mark.calculateDistance(minLonPoint, maxLonPoint); - double vertScale = (canvas.getHeight() - (TOP_BUFFER + BOT_BUFFER)) / vertDistance; + double vertScale = (CANVAS_HEIGHT - (TOP_BUFFER + BOT_BUFFER)) / vertDistance; - if ((horiDistance * vertScale) > (canvas.getWidth() - (RHS_BUFFER + LHS_BUFFER))) { - distanceScaleFactor = (canvas.getWidth() - (RHS_BUFFER + LHS_BUFFER)) / horiDistance; + if ((horiDistance * vertScale) > (CANVAS_WIDTH - (RHS_BUFFER + LHS_BUFFER))) { + distanceScaleFactor = (CANVAS_WIDTH - (RHS_BUFFER + LHS_BUFFER)) / horiDistance; scaleDirection = ScaleDirection.HORIZONTAL; } else { distanceScaleFactor = vertScale; @@ -495,21 +522,18 @@ public class CanvasController { private Point2D findScaledXY (double latA, double lonA, double latB, double lonB) { double distanceFromReference; double angleFromReference; - int yAxisLocation; - int xAxisLocation; + int xAxisLocation = (int) referencePointX; + int yAxisLocation = (int) referencePointY; angleFromReference = Mark.calculateHeadingRad(latA, lonA, latB, lonB); distanceFromReference = Mark.calculateDistance(latA, lonA, latB, lonB); if (angleFromReference > (Math.PI / 2)) { angleFromReference = (Math.PI * 2) - angleFromReference; - xAxisLocation = referencePointX; xAxisLocation -= (int) Math.round(distanceScaleFactor * Math.sin(angleFromReference) * distanceFromReference); } else { - xAxisLocation = referencePointX; xAxisLocation += (int) Math.round(distanceScaleFactor * Math.sin(angleFromReference) * distanceFromReference); } - yAxisLocation = referencePointY; yAxisLocation -= (int) Math.round(distanceScaleFactor * Math.cos(angleFromReference) * distanceFromReference); return new Point2D(xAxisLocation, yAxisLocation); diff --git a/src/main/resources/config/course.xml b/src/main/resources/config/course.xml index 90e67b7f..e11a24cf 100644 --- a/src/main/resources/config/course.xml +++ b/src/main/resources/config/course.xml @@ -11,8 +11,8 @@ Start2 - 57.6703330 - 11.8278330 + 57.6706330 + 11.8281330 @@ -29,8 +29,8 @@ Leeward Gate2 - 57.6708220 - 11.8433900 + 57.6711220 + 11.8436900 @@ -42,8 +42,8 @@ Windward Gate2 - 57.6650170 - 11.8279170 + 57.6653170 + 11.8282170 @@ -55,8 +55,8 @@ Finish2 - 57.6715240 - 11.8444950 + 57.6718240 + 11.8447950 diff --git a/src/main/resources/config/courseAlt.xml b/src/main/resources/config/courseAlt.xml new file mode 100644 index 00000000..c0f83b32 --- /dev/null +++ b/src/main/resources/config/courseAlt.xml @@ -0,0 +1,72 @@ + + + + + + Start + + Start1 + 32.296577 + -64.854304 + + + Start2 + 32.293771 + -64.855242 + + + + Mid Mark + 32.293039 + -64.843983 + + + Leeward Gate + + Leeward Gate1 + 32.284680 + -64.850045 + + + Leeward Gate2 + 32.280164 + -64.847591 + + + + Windward Gate + + Windward Gate1 + 32.309693 + -64.835249 + + + Windward Gate2 + 32.308046 + -64.831785 + + + + Finish + + Finish1 + 32.317379 + -64.839291 + + + Finish2 + 32.317257 + -64.836260 + + + + + Start + Mid Mark + Leeward Gate + Windward Gate + Leeward Gate + Finish + + +