diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties
index 804ae9958d2..25ec384adcc 100644
--- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties
+++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties
@@ -276,4 +276,5 @@ RatioDistanceLongVsShortTack=Ratio distance long tack / short tack
RatioDurationLongVsShortTack=Ratio duration long tack / short tack
Discarded=Discarded
DurationFromRaceStartToFirstTack=Duration from race start to first tack
-TypeOfFirstLeg=Type of first leg
\ No newline at end of file
+TypeOfFirstLeg=Type of first leg
+TenthInLeg=Which tenth of the leg (1-10)
\ No newline at end of file
diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties
index 5103f05f406..11745b9e767 100755
--- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties
+++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties
@@ -274,4 +274,5 @@ RatioDistanceLongVsShortTack=Verhältnis gesegelte Distanz auf Streck- zu Holebu
RatioDurationLongVsShortTack=Verhältnis gesegelte Dauer auf Streck- zu Holebug
Discarded=Gestrichen
DurationFromRaceStartToFirstTack=Dauer vom Start der Wettfahrt bis zur ersten Wende
-TypeOfFirstLeg=Art des ersten Bahnschenkels
\ No newline at end of file
+TypeOfFirstLeg=Art des ersten Bahnschenkels
+TenthInLeg=Zehntel des Bahnschenkels (1-10)
\ No newline at end of file
diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java
index de18334a094..1400ad41c1e 100644
--- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java
+++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java
@@ -38,4 +38,13 @@ public interface HasGPSFixContext {
@Statistic(messageKey = "SmoothedSpeed", resultDecimals = 2)
Speed getSmoothedSpeed();
+
+ /**
+ * @return the tenth of the leg the fix is in, computed based on the "windward distance" along the leg; the first
+ * tenth has number 1, the last tenth has number 10. Should the fix not be linked to any leg, the result is
+ * {@code null}. For reaching legs, "windward distance" translates to rhumbline-based distance
+ * (along-course).
+ */
+ @Dimension(messageKey="TenthInLeg")
+ Integer getTenthOfLeg();
}
\ No newline at end of file
diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixWithContext.java
index 4687f02c450..174fba0756d 100644
--- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixWithContext.java
+++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixWithContext.java
@@ -7,6 +7,7 @@ import com.sap.sailing.domain.common.SpeedWithBearing;
import com.sap.sailing.domain.common.TackType;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.TrackedRace;
+import com.sap.sailing.domain.tracking.WindPositionMode;
import com.sap.sse.common.Bearing;
import com.sap.sse.common.Distance;
import com.sap.sse.common.Speed;
@@ -107,4 +108,14 @@ public class GPSFixWithContext implements HasGPSFixContext {
}
return result;
}
+
+ @Override
+ public Integer getTenthOfLeg() {
+ final Distance windwardDistanceToGo = getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getWindwardDistanceToGo(getGPSFix().getTimePoint(), WindPositionMode.LEG_MIDDLE);
+ final Distance legWindwardDistance = getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getTrackedLeg().getWindwardDistance();
+ // eliminate negative values which may result if the competitor has just entered the leg but is yet to arrive at the windward
+ // level of the waypoint just rounded:
+ final double fractionSailed = Math.max(0, legWindwardDistance.add(windwardDistanceToGo.scale(-1)).divide(legWindwardDistance));
+ return (int) Math.min(10, 1+10*fractionSailed);
+ }
}
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
index 525370d26b9..0a117185073 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/places/whatsnew/resources/SailingAnalyticsNotes.html
@@ -5,6 +5,12 @@
What's New - SAP Sailing Analytics
+
November 2024
+
+ - Added a data mining dimension "tenth of leg" for competitor position fixes, such that, e.g.,
+ the first or last tenth of a leg (based on the windward distance) can be excluded during
+ data collection.
+
October 2024
- Bug fix: for match racing tie breaks, under very special circumstances the tie breaking