private bool isOnTrack(IGeoPoint point, float accuracy, out double dist) { Stopwatch watch = new Stopwatch(); watch.Start(); dist = double.MaxValue; int closest_track = 0; int closest_segment = 0; //float accuracy_offset = Math.Max(0, location.Accuracy-statistics.Accuracy); for (int t = 0; t < trackSegments.Value.Count; ++t) { GpxTrackSegment seg = trackSegments.Value[t]; for (int s = seg.TrackPoints.Count - 1; s > 0; --s) { double d = Math.Max(0, point.GetDistanceToArcSegment(seg.TrackPoints[s - 1], seg.TrackPoints[s]).Meters - accuracy); if (dist > d) { dist = d; closest_segment = s; closest_track = t; } if (d <= prefs.Value.OffTrackAlarmDistance) { watch.Stop(); logDebug(LogLevel.Verbose, $"On [{s}]" + d.ToString("0.0") + " (" + seg.TrackPoints[s - 1].ToString(geoPointFormat) + " -- " + seg.TrackPoints[s].ToString(geoPointFormat) + ") in " + watch.Elapsed.ToString()); dist = -dist; return(true); } } } watch.Stop(); this.serviceLog.Value.WriteLine(LogLevel.Verbose, $"dist {dist.ToString("0.0")} point {point.ToString(geoPointFormat)}" + $" segment {trackSegments.Value[closest_track].TrackPoints[closest_segment - 1].ToString(geoPointFormat)}" + $" -- {trackSegments.Value[closest_track].TrackPoints[closest_segment].ToString(geoPointFormat)}"); logDebug(LogLevel.Verbose, $"Off [{closest_segment}]" + dist.ToString("0.0") + " in " + watch.Elapsed.ToString()); return(false); }