Exemplo n.º 1
0
 public ParameterizedLocation GetNextPLNode(ParameterizedLocation pl, ParameterizedLocation.Direction direction)
 {
     if (direction == ParameterizedLocation.Direction.Forward)
       {
     if (pl.Floor().Value + 1 > segments[pl.SegmentIndex].Waypoints.Count - 1)
     {
       if (pl.SegmentIndex + 1 > segments.Count - 1) return null;
       return new ParameterizedLocation(pl.SegmentIndex + 1, 0);
     }
     return new ParameterizedLocation(pl.SegmentIndex, pl.Floor().Value + 1);
       }
       else
       {
     if (pl.Ceiling().Value - 1 < 0)
     {
       if (pl.SegmentIndex <= 0) return null;
       return new ParameterizedLocation(pl.SegmentIndex - 1, segments[pl.SegmentIndex - 1].Waypoints.Count - 1);
     }
     return new ParameterizedLocation(pl.SegmentIndex, pl.Ceiling().Value - 1);
       }
 }
Exemplo n.º 2
0
        public double? GetAttributeFromParameterizedLocation(WaypointAttribute attribute, ParameterizedLocation parameterizedLocation)
        {
            List<Waypoint> waypoints = segments[parameterizedLocation.SegmentIndex].Waypoints;
              if (parameterizedLocation.IsNode)
              {
            return waypoints[(int)parameterizedLocation.Value].Attributes.ContainsKey(attribute)
              ? waypoints[(int)parameterizedLocation.Value].Attributes[attribute]
              : null;
              }
              var i = (int)parameterizedLocation.Floor().Value;
              if (i >= waypoints.Count - 1) i = waypoints.Count - 2;
              if (waypoints.Count < 2) return waypoints[0].Attributes[attribute];
              double d = parameterizedLocation.Value - i;

              return GetAttributeValueBetweenWaypoints(waypoints[i], waypoints[i + 1], d, attribute);
        }
Exemplo n.º 3
0
        public LongLat GetLocationFromParameterizedLocation(ParameterizedLocation parameterizedLocation)
        {
            List<Waypoint> waypoints = segments[parameterizedLocation.SegmentIndex].Waypoints;
              if (parameterizedLocation.IsNode) return waypoints[(int)parameterizedLocation.Value].LongLat;
              var i = (int)parameterizedLocation.Floor().Value;
              if (i >= waypoints.Count - 1) i = waypoints.Count - 2;
              if (waypoints.Count < 2) return waypoints[0].LongLat;
              double d = parameterizedLocation.Value - i;
              LongLat p0 = waypoints[i].LongLat;
              LongLat p1 = waypoints[i + 1].LongLat;

              return new LongLat(p0.Longitude + d * (p1.Longitude - p0.Longitude), p0.Latitude + d * (p1.Latitude - p0.Latitude));
        }
Exemplo n.º 4
0
        public Waypoint CreateWaypointFromParameterizedLocation(ParameterizedLocation parameterizedLocation)
        {
            var w = new Waypoint();
              List<Waypoint> waypoints = segments[parameterizedLocation.SegmentIndex].Waypoints;
              var i = (int)parameterizedLocation.Floor().Value;
              if (i >= waypoints.Count - 1) i = waypoints.Count - 2;
              if (waypoints.Count < 2) return waypoints[0];
              double d = parameterizedLocation.Value - i;

              // time
              DateTime dt0 = waypoints[i].Time;
              DateTime dt1 = waypoints[i + 1].Time;
              w.Time = new DateTime(dt0.Ticks + (long)(d * (dt1.Ticks - dt0.Ticks)), dt0.Kind);

              // location
              LongLat p0 = waypoints[i].LongLat;
              LongLat p1 = waypoints[i + 1].LongLat;
              w.LongLat = new LongLat(p0.Longitude + d * (p1.Longitude - p0.Longitude),
                              p0.Latitude + d * (p1.Latitude - p0.Latitude));

              // altitude
              if (waypoints[i].Altitude.HasValue && waypoints[i + 1].Altitude.HasValue)
              {
            w.Altitude = waypoints[i].Altitude + d * (waypoints[i + 1].Altitude - waypoints[i].Altitude);
              }

              // heart rate
              if (waypoints[i].HeartRate.HasValue && waypoints[i + 1].HeartRate.HasValue)
              {
            w.HeartRate = waypoints[i].HeartRate + d * (waypoints[i + 1].HeartRate - waypoints[i].HeartRate);
              }

              var attributes = new List<WaypointAttribute>
                         {
                           WaypointAttribute.Pace,
                           WaypointAttribute.HeartRate,
                           WaypointAttribute.Altitude,
                           WaypointAttribute.Speed,
                           WaypointAttribute.DirectionDeviationToNextLap,
                           WaypointAttribute.ElapsedTime,
                           WaypointAttribute.Distance,
                           WaypointAttribute.Inclination,
                           WaypointAttribute.Direction,
                           WaypointAttribute.Longitude,
                           WaypointAttribute.Latitude,
                           WaypointAttribute.Cadence,
                           WaypointAttribute.Power
                         };

              // map reading
              if(waypointAttributeExists[WaypointAttribute.MapReadingDuration])
              {
            if(parameterizedLocation.IsNode)
            {
              w.MapReadingState = waypoints[i].MapReadingState;
            }
            else
            {
              w.MapReadingState = waypoints[i].MapReadingState == MapReadingState.NotReading || waypoints[i + 1].MapReadingState == MapReadingState.NotReading
            ? MapReadingState.NotReading
            : MapReadingState.Reading;
            }
            attributes.AddRange(new[]
                              {
                                WaypointAttribute.MapReadingDuration,
                                WaypointAttribute.MapReadingState,
                                WaypointAttribute.PreviousMapReadingEnd,
                                WaypointAttribute.NextMapReadingStart,
                              });
              }

              foreach (var attribute in attributes)
              {
            w.Attributes[attribute] = GetAttributeValueBetweenWaypoints(waypoints[i], waypoints[i + 1], d, attribute);
              }

              return w;
        }
Exemplo n.º 5
0
 private ParameterizedLocation GetParameterizedLocationOfPreviousWaypoint(
     ParameterizedLocation parameterizedLocation, bool forceAdvance)
 {
     if (!parameterizedLocation.IsNode)
       {
     return new ParameterizedLocation(parameterizedLocation.SegmentIndex, parameterizedLocation.Floor().Value);
       }
       else if (parameterizedLocation.Value > 0)
       {
     return new ParameterizedLocation(parameterizedLocation.SegmentIndex,
                                  parameterizedLocation.Value - (forceAdvance ? 1 : 0));
       }
       else if (forceAdvance && parameterizedLocation.SegmentIndex > 0)
       {
     return new ParameterizedLocation(parameterizedLocation.SegmentIndex - 1,
                                  segments[parameterizedLocation.SegmentIndex - 1].Waypoints.Count - 1);
       }
       else
       {
     return new ParameterizedLocation(parameterizedLocation.SegmentIndex, 0);
       }
 }
Exemplo n.º 6
0
        public DateTime GetTimeFromParameterizedLocation(ParameterizedLocation parameterizedLocation)
        {
            List<Waypoint> waypoints = segments[parameterizedLocation.SegmentIndex].Waypoints;
              if (parameterizedLocation.IsNode) return waypoints[(int)parameterizedLocation.Value].Time;
              var i = (int)parameterizedLocation.Floor().Value;
              if (i >= waypoints.Count - 1) i = waypoints.Count - 2;
              if (waypoints.Count < 2) return waypoints[0].Time;
              double d = parameterizedLocation.Value - i;

              DateTime dt0 = waypoints[i].Time;
              DateTime dt1 = waypoints[i + 1].Time;
              return new DateTime(dt0.Ticks + (long)(d * (dt1.Ticks - dt0.Ticks)), dt0.Kind);
        }
Exemplo n.º 7
0
        public PointD GetProjectedLocationFromParameterizedLocation(ParameterizedLocation parameterizedLocation,
            LongLat projectionOrigin)
        {
            List<Waypoint> waypoints = segments[parameterizedLocation.SegmentIndex].Waypoints;
              if (parameterizedLocation.IsNode) return waypoints[(int)parameterizedLocation.Value].LongLat.Project(projectionOrigin);
              var i = (int)parameterizedLocation.Floor().Value;
              if (i >= waypoints.Count - 1) i = waypoints.Count - 2;
              if (waypoints.Count < 2) return waypoints[0].LongLat.Project(projectionOrigin);
              double d = parameterizedLocation.Value - i;

              PointD p0 = waypoints[i].LongLat.Project(projectionOrigin);
              PointD p1 = waypoints[i + 1].LongLat.Project(projectionOrigin);

              return new PointD(p0.X + d * (p1.X - p0.X), p0.Y + d * (p1.Y - p0.Y));
        }
Exemplo n.º 8
0
        public double? GetOriginalAttributeFromParameterizedLocation(WaypointAttribute attribute, ParameterizedLocation parameterizedLocation)
        {
            if (attribute != WaypointAttribute.HeartRate && attribute != WaypointAttribute.Altitude) throw new ArgumentException("The 'attribute' parameter must be either WaypointAttribute.HeartRate or WaypointAttribute.Altitude");

              List<Waypoint> waypoints = segments[parameterizedLocation.SegmentIndex].Waypoints;
              if (parameterizedLocation.IsNode) return waypoints[(int)parameterizedLocation.Value].GetOriginalAttribute(attribute);
              var i = (int)parameterizedLocation.Floor().Value;
              if (i >= waypoints.Count - 1) i = waypoints.Count - 2;
              if (waypoints.Count < 2) return waypoints[0].GetOriginalAttribute(attribute);
              double d = parameterizedLocation.Value - i;

              var v0 = waypoints[i].GetOriginalAttribute(attribute);
              var v1 = waypoints[i + 1].GetOriginalAttribute(attribute);
              if (v0.HasValue && v1.HasValue) return v0 + d * (v1 - v0);
              return null;
        }