don't try to compute line advantage if there is no leg (only one waypoint)

This commit is contained in:
Axel Uhl committed 2013-11-18 14:03:48 +01:00
1 parent b150e773cc
commit 90bbf7014a
1 file changed
+44 -38
@@ -2627,46 +2627,52 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener {
}
}
LineLengthAndAdvantage result = null;
try {
if (allMarksHavePositions && numberOfMarks == 2) {
Wind combinedWind = getWind(markPositions.get(0), timePoint);
Distance distanceFromFirstToSecondMark;
final int indexOfWaypoint = getRace().getCourse().getIndexOfWaypoint(waypoint);
final boolean isStartLine = indexOfWaypoint == 0;
final TrackedLeg legDeterminingDirection = getTrackedLeg(
getRace().getCourse().getLegs().get(isStartLine?0:indexOfWaypoint-1));
distanceFromFirstToSecondMark = legDeterminingDirection
.getWindwardDistance(markPositions.get(0), markPositions.get(1), timePoint);
final Position worseMark;
final Position betterMark;
final Distance distanceAdvantage;
if ((isStartLine && distanceFromFirstToSecondMark.getMeters() > 0) ||
(!isStartLine && distanceFromFirstToSecondMark.getMeters() < 0)) {
// first mark is worse than second mark
worseMark = markPositions.get(0);
betterMark = markPositions.get(1);
} else {
// second mark is worse than first mark
worseMark = markPositions.get(1);
betterMark = markPositions.get(0);
final List<Leg> legs = getRace().getCourse().getLegs();
// need at least one leg to make sense of a line
if (!legs.isEmpty()) {
try {
if (allMarksHavePositions && numberOfMarks == 2) {
Wind combinedWind = getWind(markPositions.get(0), timePoint);
Distance distanceFromFirstToSecondMark;
final int indexOfWaypoint = getRace().getCourse().getIndexOfWaypoint(waypoint);
final boolean isStartLine = indexOfWaypoint == 0;
final TrackedLeg legDeterminingDirection = getTrackedLeg(legs.get(isStartLine ? 0
: indexOfWaypoint - 1));
distanceFromFirstToSecondMark = legDeterminingDirection.getWindwardDistance(markPositions.get(0),
markPositions.get(1), timePoint);
final Position worseMark;
final Position betterMark;
final Distance distanceAdvantage;
if ((isStartLine && distanceFromFirstToSecondMark.getMeters() > 0)
|| (!isStartLine && distanceFromFirstToSecondMark.getMeters() < 0)) {
// first mark is worse than second mark
worseMark = markPositions.get(0);
betterMark = markPositions.get(1);
} else {
// second mark is worse than first mark
worseMark = markPositions.get(1);
betterMark = markPositions.get(0);
}
if (distanceFromFirstToSecondMark.getMeters() >= 0) {
distanceAdvantage = distanceFromFirstToSecondMark;
} else {
distanceAdvantage = new CentralAngleDistance(
-distanceFromFirstToSecondMark.getCentralAngleRad());
}
final NauticalSide advantageousSide;
if (betterMark.crossTrackError(worseMark, legDeterminingDirection.getLegBearing(timePoint))
.getCentralAngleRad() > 0) {
advantageousSide = NauticalSide.STARBOARD;
} else {
advantageousSide = NauticalSide.PORT;
}
result = new LineLengthAndAdvantageImpl(timePoint, waypoint, worseMark.getDistance(betterMark),
worseMark.getBearingGreatCircle(betterMark).getDifferenceTo(combinedWind.getFrom()),
advantageousSide, distanceAdvantage);
}
if (distanceFromFirstToSecondMark.getMeters() >= 0) {
distanceAdvantage = distanceFromFirstToSecondMark;
} else {
distanceAdvantage = new CentralAngleDistance(-distanceFromFirstToSecondMark.getCentralAngleRad());
}
final NauticalSide advantageousSide;
if (betterMark.crossTrackError(worseMark, legDeterminingDirection.getLegBearing(timePoint)).getCentralAngleRad() > 0) {
advantageousSide = NauticalSide.STARBOARD;
} else {
advantageousSide = NauticalSide.PORT;
}
result = new LineLengthAndAdvantageImpl(timePoint, waypoint, worseMark.getDistance(betterMark),
worseMark.getBearingGreatCircle(betterMark).getDifferenceTo(combinedWind.getFrom()),
advantageousSide, distanceAdvantage);
} catch (NoWindException e) {
// result remains null;
}
} catch (NoWindException e) {
// result remains null;
}
return result;
}