string ResolveTextFromPreviousFrame(int frameId, double angle) { var frame = Timeline.Data[frameId]; var lastFrame = Timeline.LatestFrame(f => f.Heading.Value, frameId - 1); if (lastFrame != null && (frame.Seconds - lastFrame.Seconds) < 1) { var lastFrameExtended = (ExtendedData)lastFrame.Heading.ForIndicatorUse; var dN = Math.Abs(Math2.DiffAngles(angle, lastFrameExtended.LastN)); var dE = Math.Abs(Math2.DiffAngles(angle, lastFrameExtended.LastE)); var dS = Math.Abs(Math2.DiffAngles(angle, lastFrameExtended.LastS)); var dW = Math.Abs(Math2.DiffAngles(angle, lastFrameExtended.LastW)); var T = 15; // Degrees motion var tx = 0; if (dN < T) { tx++; } if (dE < T) { tx++; } if (dS < T) { tx++; } if (dW < T) { tx++; } if (tx == 1) { if (dN < T) { return("N"); } if (dE < T) { return("E"); } if (dS < T) { return("S"); } if (dW < T) { return("W"); } } } return(null); }
private double CheckResultValidity(double ret, int frameId) { var prev = Timeline.LatestFrame(d => d.Heading.Value, frameId); if (prev != null && !double.IsNaN(Timeline.Data[frameId].Heading.Value)) { var dT = Timeline.Data[frameId].Heading.SecondsWhenComputed - prev.Heading.SecondsWhenComputed; if (dT < 1) { var dX = Math2.DiffAngles(Timeline.Data[frameId].Heading.Value, prev.Heading.Value); if (Math.Abs(dX) > 10) { // can't move more than 20 deg in one second ret = double.NaN; } } } return(ret); }