mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-13 15:50:59 +00:00
don't try to compute line advantage if there is no leg (only one waypoint)
This commit is contained in:
1 parent
b150e773cc
commit
90bbf7014a
1 file changed
+44
-38
+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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user