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 d2cb7232196..8d2730eceda 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties +++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties @@ -249,8 +249,10 @@ TotalDistanceToNeighboursPerpendicularToStarLineAtStartOfRace=Sum of absolute di TotalWindwardDistanceToNeighboursAtStartOfRace=Sum of absolute windward distances to start line neighbors at race start TotalDistanceToNeighboursProjectedToStartLineAtStartOfRace=Sum of along-line distances to start line neighbors (or end of line, respectively) at race start IRM=IRM Code (OCS, DNC, DNF, etc.) -XTE=Cross-Track Error -AbsoluteXTE=Absolute Cross-Track Error +XTE=Cross-Track Error, signed (- = left, + = right) +AbsoluteXTE=Absolute Cross-Track Error, unsigned +XTERelativeSigned=Relative Cross-Track Error, signed (-1 = 1/2 leg length left, 0 = middle, +1 = 1/2 leg length right) +XTERelativeUnsigned=Relative Cross-Track Error, unsigned (0 = middle, 1 = 1/2 leg length out) Day=Day CompetitorDay=Competitor Day CompetitorDaySailingDomainRetrieverChain=Competitor-Day for race 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 043fbbba635..a346aee080a 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 @@ -252,8 +252,10 @@ TotalDistanceToNeighboursPerpendicularToStarLineAtStartOfRace=Summe der absolute TotalWindwardDistanceToNeighboursAtStartOfRace=Summe der windwärtigen absoluten Abstände zu beiden Startlinien-Nachbarn TotalDistanceToNeighboursProjectedToStartLineAtStartOfRace=Summe der Abstände zu beiden Startlinien-Nachbarn bzw. den Enden der Linie, projiziert auf die Startlinie IRM=IRM Code (OCS, DNC, DNF etc.) -XTE=Querabweichung -AbsoluteXTE=Absolute Querabweichung +XTE=Absolute Querabweichung, vorzeichenbehaftet (- = links, + = rechts) +AbsoluteXTE=Absolute Querabweichung, ohne Vorzeichen +XTERelativeSigned=Relative Querabweichung, mit Vorzeichen (-1 = 1/2 Schenkellänge links, 0 = Mitte, +1 = 1/2 Schenkellänge rechts) +XTERelativeUnsigned=Relative Querabweichung, ohne Vorzeichen (0 = Mitte, 1 = ganz aussen) Day=Tag CompetitorDay=Teilnehmer-Tag CompetitorDaySailingDomainRetrieverChain=Teilnehmer-Tag für Wettfahrt 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 1400ad41c1e..2d04130bcd4 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 @@ -36,6 +36,12 @@ public interface HasGPSFixContext { @Statistic(messageKey = "AbsoluteXTE", resultDecimals = 2) Distance getAbsoluteXTE(); + @Statistic(messageKey = "XTERelativeSigned", resultDecimals = 2) + Double getRelativeXTESigned(); + + @Statistic(messageKey = "XTERelativeUnsigned", resultDecimals = 2) + Double getRelativeXTEUnsigned(); + @Statistic(messageKey = "SmoothedSpeed", resultDecimals = 2) Speed getSmoothedSpeed(); 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 174fba0756d..db85ee7a41b 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 @@ -93,6 +93,23 @@ public class GPSFixWithContext implements HasGPSFixContext { return getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getAbsoluteCrossTrackError(getTimePoint()); } + @Override + public Double getRelativeXTESigned() { + // The XTE is calculated relative to half the leg length + return getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getSignedCrossTrackError(getTimePoint()) + .divide(getTrackedLegOfCompetitorContext().getTrackedLegContext().getTrackedLeg().getGreatCircleDistance(getTimePoint())) + * 2.0; // half the leg length + } + + @Override + public Double getRelativeXTEUnsigned() { + // The XTE is calculated relative to the leg length + return getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getAbsoluteCrossTrackError(getTimePoint()) + .divide(getTrackedLegOfCompetitorContext().getTrackedLegContext().getTrackedLeg().getGreatCircleDistance(getTimePoint())) + * 2.0; // half the leg length + } + + @Override public TackType getTackType() throws NoWindException { return getTrackedLegOfCompetitorContext().getTrackedLegOfCompetitor().getTackType(getTimePoint());