all paths now join up

#story[1087]
This commit is contained in:
hba56
2017-08-08 14:47:11 +12:00
parent ef3f468b19
commit 22722286ef
@@ -521,48 +521,87 @@ public class ResizableRaceCanvas extends ResizableCanvas {
*/ */
public void drawRaceLine(){ public void drawRaceLine(){
List<Leg> legs = this.visualiserRace.getLegs(); List<Leg> legs = this.visualiserRace.getLegs();
GPSCoordinate legStartPoint = legs.get(0).getStartCompoundMark().getAverageGPSCoordinate();
GPSCoordinate nextStartPoint;
for (int i = 0; i < legs.size() -1; i++) { for (int i = 0; i < legs.size() -1; i++) {
drawLineRounding(legs.get(i)); nextStartPoint = drawLineRounding(legs, i, legStartPoint);
legStartPoint = nextStartPoint;
} }
} }
private void drawLineRounding(Leg leg){ /**
//finds the direction of the leg as a bearing * Draws a line around a course that shows where boats need to go. This method
GPSCoordinate startDirectionLinePoint = leg.getStartCompoundMark().getAverageGPSCoordinate(); * draws the line leg by leg
GPSCoordinate endDirectionLinePoint = leg.getEndCompoundMark().getAverageGPSCoordinate(); * @param legs the legs of a race
Bearing bearingOfDirectionLine = GPSCoordinate.calculateBearing(startDirectionLinePoint, endDirectionLinePoint); * @param index the index of the current leg to use
* @return the end point of the current leg that has been drawn
*/
private GPSCoordinate drawLineRounding(List<Leg> legs, int index, GPSCoordinate legStartPoint){
GPSCoordinate startDirectionLinePoint;
GPSCoordinate endDirectionLinePoint;
Bearing bearingOfDirectionLine;
//use the direction line to find a point parallel to it by the mark GPSCoordinate startNextDirectionLinePoint;
GPSCoordinate pointToStartCurve = GPSCoordinate.calculateNewPosition(endDirectionLinePoint, GPSCoordinate endNextDirectionLinePoint;
150, Azimuth.fromDegrees(bearingOfDirectionLine.degrees()+90)); Bearing bearingOfNextDirectionLine;
//use the direction line to find a point to curve too //finds the direction of the current leg as a bearing
GPSCoordinate pointToEndCurve = GPSCoordinate.calculateNewPosition(endDirectionLinePoint, startDirectionLinePoint = legStartPoint;
150, Azimuth.fromDegrees(bearingOfDirectionLine.degrees())); endDirectionLinePoint = legs.get(index).getEndCompoundMark().getMark1Position();
bearingOfDirectionLine = GPSCoordinate.calculateBearing(startDirectionLinePoint, endDirectionLinePoint);
//use the curve points to find the two control points for the bezier curve //finds the direction of the next leg as a bearing
Bearing bearingOfCurveLine = GPSCoordinate.calculateBearing(pointToStartCurve, pointToEndCurve); if (index < legs.size() -2){ // not last leg
GPSCoordinate controlPoint1 = GPSCoordinate.calculateNewPosition(pointToStartCurve, startNextDirectionLinePoint = legs.get(index + 1).getStartCompoundMark().getMark1Position();
150, Azimuth.fromDegrees(bearingOfCurveLine.degrees()+ 50)); endNextDirectionLinePoint = legs.get(index + 1).getEndCompoundMark().getMark1Position();
bearingOfNextDirectionLine = GPSCoordinate.calculateBearing(startNextDirectionLinePoint, endNextDirectionLinePoint);
//change all gps into graph coordinate //use the direction line to find a point parallel to it by the mark
GraphCoordinate startPath = this.map.convertGPS(startDirectionLinePoint); GPSCoordinate pointToStartCurve = GPSCoordinate.calculateNewPosition(endDirectionLinePoint,
GraphCoordinate curvePoint = this.map.convertGPS(pointToStartCurve); 150, Azimuth.fromDegrees(bearingOfDirectionLine.degrees()+90));
GraphCoordinate curvePointEnd = this.map.convertGPS(pointToEndCurve);
GraphCoordinate c1 = this.map.convertGPS(controlPoint1);
gc.setStroke(Color.RED); //use the direction line to find a point to curve too
gc.setLineWidth(1); GPSCoordinate pointToEndCurve = GPSCoordinate.calculateNewPosition(endDirectionLinePoint,
150, Azimuth.fromDegrees(bearingOfNextDirectionLine.degrees()+90));
gc.beginPath(); //use the curve points to find the two control points for the bezier curve
gc.moveTo(startPath.getX(), startPath.getY()); Bearing bearingOfCurveLine = GPSCoordinate.calculateBearing(pointToStartCurve, pointToEndCurve);
gc.lineTo(curvePoint.getX(), curvePoint.getY()); GPSCoordinate controlPoint = GPSCoordinate.calculateNewPosition(pointToStartCurve,
gc.bezierCurveTo(c1.getX(), c1.getY(), c1.getX(), c1.getY(), curvePointEnd.getX(), curvePointEnd.getY()); 75, Azimuth.fromDegrees(bearingOfCurveLine.degrees()+ 50));
gc.stroke();
gc.closePath();
gc.save();
drawArrowHead(controlPoint1, pointToEndCurve); //change all gps into graph coordinate
GraphCoordinate startPath = this.map.convertGPS(startDirectionLinePoint);
GraphCoordinate curvePoint = this.map.convertGPS(pointToStartCurve);
GraphCoordinate curvePointEnd = this.map.convertGPS(pointToEndCurve);
GraphCoordinate c1 = this.map.convertGPS(controlPoint);
gc.setStroke(Color.RED);
gc.setLineWidth(1);
gc.beginPath();
gc.moveTo(startPath.getX(), startPath.getY());
gc.lineTo(curvePoint.getX(), curvePoint.getY());
gc.bezierCurveTo(c1.getX(), c1.getY(), c1.getX(), c1.getY(), curvePointEnd.getX(), curvePointEnd.getY());
gc.stroke();
gc.closePath();
gc.save();
drawArrowHead(controlPoint, pointToEndCurve);
return pointToEndCurve;
}else{//last leg so no curve
GraphCoordinate startPath = this.map.convertGPS(legStartPoint);
GraphCoordinate endPath = this.map.convertGPS(legs.get(index).getEndCompoundMark().getAverageGPSCoordinate());
gc.beginPath();
gc.moveTo(startPath.getX(), startPath.getY());
gc.lineTo(endPath.getX(), endPath.getY());
gc.stroke();
gc.closePath();
gc.save();
drawArrowHead(legStartPoint, legs.get(index).getEndCompoundMark().getAverageGPSCoordinate());
return null;
}
} }
private void drawArrowHead(GPSCoordinate start, GPSCoordinate end){ private void drawArrowHead(GPSCoordinate start, GPSCoordinate end){