private void PrepareDistanceMatrix()
        {
            distanceMatrix = new double[allPoints.Count, allPoints.Count];
            for (int i = 0; i < allPoints.Count; i++)
            {
                for (int j = 0; j < allPoints.Count; j++)
                {
                    distanceMatrix[i, j] = -1000;
                }
            }

            foreach (GeoPath path in mapData["Paths"])
            {
                GeoPoint point1 = path.Path.ElementAt(0);
                GeoPoint point2;
                for (int i = 1; i < path.Path.Count; i++)
                {
                    point2 = path.Path.ElementAt(i);
                    double dist = LatLongMath.GetDistance(pointsByID[point1.ID].Position, pointsByID[point2.ID].Position);

                    //Important since the path is both ways - bidirectional and the probe may occur from any side.
                    distanceMatrix[pointsIndex[point1.ID], pointsIndex[point2.ID]] = dist;
                    distanceMatrix[pointsIndex[point2.ID], pointsIndex[point1.ID]] = dist;

                    //The right sequence is to make the point1 = point2 otherwise the base always remains the same
                    point1 = point2;
                }
            }

            unvisitedNodes = new List <GeoGraphPoint>(allPoints.Count);
        }
        public void SwitchToNavigator(GeoPlacemark destination)
        {
            int    nodeID = int.MaxValue;
            double tempDistance = double.PositiveInfinity, dummy;

            foreach (GeoPoint point in allPoints)
            {
                if ((dummy = LatLongMath.GetDistance(currentPosition, point.Position)) < tempDistance)
                {
                    tempDistance = dummy;
                    nodeID       = point.ID;
                }
            }

            if (nodeID != int.MaxValue)
            {
                pathWay = FindShortestPath(pointsByID[nodeID], destination);
            }

            GeoPlacemark place = pathWay.ElementAt(0);

            place.Distance    = LatLongMath.GetDistance(currentPosition, place.Position);
            place.Orientation = LatLongMath.GetCompassBearing(currentPosition, place.Position);

            Mode = AugmentedMode.Navigator;
        }
        public void PositionUpdate(GeoCoordinate position)
        {
            currentPosition = position;
            if (Mode == AugmentedMode.Explorer)
            {
                UpdatePlacemarks();
            }
            else if (Mode == AugmentedMode.Navigator)
            {
                if (pathWay != null)
                {
                    if (pathWay.Count > 0)
                    {
                        if (LatLongMath.GetDistance(position, pathWay.ElementAt(0).Position) <= distanceThreshold)
                        {
                            pathWay.RemoveAt(0);
                        }
                    }

                    if (pathWay.Count > 0)
                    {
                        GeoPlacemark place = pathWay.ElementAt(0);
                        place.Orientation = LatLongMath.GetCompassBearing(position, place.Position);
                        place.Distance    = LatLongMath.GetDistance(position, place.Position);
                    }
                }
            }
        }
 private void UpdatePlacemarks()
 {
     foreach (GeoPlacemark placemark in allPlacemarks)
     {
         placemark.Orientation = LatLongMath.GetCompassBearing(currentPosition, placemark.Position);
         placemark.Distance    = LatLongMath.GetDistance(currentPosition, placemark.Position);
     }
 }
        private void PrepareDisplayPositions()
        {
            foreach (GeoPlacemark place in visiblePlacemarks)
            {
                double mathAngle = 90 - Math.Abs(place.Angle);
                double x         = (place.Distance * Math.Cos(LatLongMath.ToRad(mathAngle)));
                double y         = (place.Distance * Math.Sin(LatLongMath.ToRad(mathAngle)));

                x = (x * (displayWidth / maxDistance));
                y = (place.Distance * (displayHeight / maxDistance));

                if (place.Angle < 0)
                {
                    x = -x;
                }

                place.DisplayX = (displayWidth / 2) + x;
                place.DisplayY = (displayHeight - y);
            }
        }
        public GeoPlacemark GetNextPoint(double compassHeading)
        {
            if (pathWay.Count > 0)
            {
                GeoPlacemark place = pathWay.ElementAt(0);

                double newSpan = 80;

                left  = ((compassHeading - newSpan) + 360) % 360;
                right = ((compassHeading + newSpan) + 360) % 360;

                place.Angle = FindAngularDisplacement(place, compassHeading);

                if (place.Angle != -180)
                {
                    double mathAngle = 90 - Math.Abs(place.Angle);
                    double x         = (place.Distance * Math.Cos(LatLongMath.ToRad(mathAngle)));
                    double y         = (place.Distance * Math.Sin(LatLongMath.ToRad(mathAngle)));

                    x = (x * ((displayWidth / 3) / place.Distance));
                    y = (place.Distance * (displayHeight / (maxDistance / 3)));

                    if (place.Angle < 0)
                    {
                        x = -x;
                    }

                    place.DisplayX = (displayWidth / 2) + x;
                    //place.DisplayY = (displayHeight - y);
                    place.DisplayY = (displayHeight) - y;
                }

                return(place);
            }
            return(null);
        }