Moved away from custom average speed computation and now being in line with calculation used by LeaderboardPanel

This commit is contained in:
Simon Pamies committed 2017-10-20 10:15:04 +02:00
1 parent ee1331f649
commit b36f652a44
15 files changed
+68 -37

No files matched your search

@@ -25,9 +25,11 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnListener;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.Mile;
import com.sap.sailing.domain.common.NoWindError;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.impl.KnotSpeedImpl;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.NumberOfCompetitorsInLeaderboardFetcher;
@@ -40,6 +42,7 @@ import com.sap.sailing.domain.racelog.RaceLogIdentifier;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.util.impl.RaceColumnListeners;
import com.sap.sse.common.Duration;
import com.sap.sse.common.ObscuringIterable;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
@@ -789,31 +792,12 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW
@Override
public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
Speed result = null;
for (TrackedRace trackedRace : getTrackedRaces()) {
if (Util.contains(trackedRace.getRace().getCompetitors(), competitor)) {
NavigableSet<MarkPassing> markPassings = trackedRace.getMarkPassings(competitor);
if (!markPassings.isEmpty()) {
TimePoint from = markPassings.first().getTimePoint();
TimePoint to;
if (timePoint.after(markPassings.last().getTimePoint()) &&
markPassings.last().getWaypoint() == trackedRace.getRace().getCourse().getLastWaypoint()) {
// stop counting when competitor finished the race
to = markPassings.last().getTimePoint();
} else {
if (markPassings.last().getWaypoint() != trackedRace.getRace().getCourse().getLastWaypoint() &&
timePoint.after(markPassings.last().getTimePoint())) {
result = null;
break;
}
to = timePoint;
}
Distance distanceTraveled = trackedRace.getDistanceTraveled(competitor, timePoint);
if (distanceTraveled != null) {
result = distanceTraveled.inTime(to.asMillis()-from.asMillis());
}
}
}
Speed result = null;
final Duration totalTimeSailed = this.getTotalTimeSailed(competitor, timePoint);
final Distance totalDistanceSailed = this.getTotalDistanceTraveled(competitor, timePoint);
if (totalDistanceSailed != null && totalTimeSailed != null) {
result = new KnotSpeedImpl(totalDistanceSailed.getMeters() /
totalTimeSailed.asSeconds() / Mile.METERS_PER_NAUTICAL_MILE * 3600.0);
}
return result;
}
@@ -1012,4 +1012,12 @@ public interface TrackedRace extends Serializable, IsManagedByCache<SharedDomain
*/
Iterable<RaceLog> getAttachedRaceLogs();
/**
* Computes the average speed over ground for a {@link Competitor} based on times and distances
* for all finished {@link TrackedLegOfCompetitor}s.
*
* @param timePoint time point up and until to compute the speed
*/
Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint);
}
@@ -74,6 +74,7 @@ import com.sap.sailing.domain.common.CourseChange;
import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.LegType;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.Mile;
import com.sap.sailing.domain.common.NauticalSide;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Position;
@@ -4189,4 +4190,23 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
public Iterable<RaceLog> getAttachedRaceLogs() {
return new HashSet<>(attachedRaceLogs.values());
}
@Override
public Speed getAverageSpeedOverGround(Competitor competitor, TimePoint timePoint) {
Speed result = null;
Duration totalTimeSailedInRace = Duration.NULL;
Distance totalDistanceSailedInRace = Distance.NULL;
for (TrackedLeg legGeneral : getTrackedLegs()) {
TrackedLegOfCompetitor leg = legGeneral.getTrackedLeg(competitor);
if (leg != null && leg.getTime(timePoint) != null) {
totalDistanceSailedInRace.add(leg.getDistanceTraveled(timePoint));
totalTimeSailedInRace.plus(leg.getTime(timePoint));
}
}
if (!totalTimeSailedInRace.equals(Duration.NULL) && !totalDistanceSailedInRace.equals(Distance.NULL)) {
result = new KnotSpeedImpl(totalDistanceSailedInRace.getMeters() /
totalTimeSailedInRace.asSeconds() / Mile.METERS_PER_NAUTICAL_MILE * 3600.0);
}
return result;
}
}