mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-21 11:40:01 +00:00
Moved away from custom average speed computation and now being in line with calculation used by LeaderboardPanel
This commit is contained in:
1 parent
ee1331f649
commit
b36f652a44
15 files changed
+68
-37
No files matched your search
+9
-25
@@ -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);
|
||||
|
||||
}
|
||||
+20
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user