Example #1
0
        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);
        }