/[cits3200i]/branches/metadata-branch-rvvs89/UWAPlugins/MetadataPlugin/Source/MetadataRouteControlLayer.cs


UCC Code Repository

Diff of /branches/metadata-branch-rvvs89/UWAPlugins/MetadataPlugin/Source/MetadataRouteControlLayer.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 91 by rvvs89, Tue Oct 12 21:18:41 2010 UTC revision 92 by rvvs89, Tue Oct 12 22:01:08 2010 UTC
# Line 4  using System.Text; Line 4  using System.Text;
4  using ZoneFiveSoftware.Common.Visuals.Mapping;  using ZoneFiveSoftware.Common.Visuals.Mapping;
5  using ZoneFiveSoftware.Common.Data.Fitness;  using ZoneFiveSoftware.Common.Data.Fitness;
6  using ZoneFiveSoftware.Common.Visuals.Util;  using ZoneFiveSoftware.Common.Visuals.Util;
7    using ZoneFiveSoftware.Common.Data.GPS;
8    using ZoneFiveSoftware.Common.Data;
9    
10  namespace MetadataPlugin.Source  namespace MetadataPlugin.Source
11  {  {
# Line 41  namespace MetadataPlugin.Source Line 43  namespace MetadataPlugin.Source
43              }              }
44          }          }
45    
46            private static DateTime DateTimeMin(DateTime a, DateTime b)
47            {
48                return a < b ? a : b;
49            }
50    
51            private static DateTime DateTimeMax(DateTime a, DateTime b)
52            {
53                return a > b ? a : b;
54            }
55    
56            private static int RouteIndexFromDistance(IGPSRoute route, double distance, out double remaining)
57            {
58                IEnumerator<ITimeValueEntry<IGPSPoint>> i = route.GetEnumerator();
59                int index = 0;
60                double count = 0.0;
61                i.MoveNext();
62                IGPSPoint prev = i.Current.Value;
63                remaining = 0;
64                while (i.MoveNext())
65                {
66                    IGPSPoint cur = i.Current.Value;
67                    remaining = distance - count;
68                    count += prev.DistanceMetersToPoint(cur);
69                    if (count < distance)
70                    {
71                        index++;
72                        prev = cur;
73                    }
74                    else
75                    {
76                        return index;
77                    }
78                }
79                return index;
80            }
81    
82            private static DateTime RouteTimeFromDistance(IGPSRoute route, double distance)
83            {
84                double remaining;
85                int index = RouteIndexFromDistance(route, distance, out remaining);
86                if (remaining > 0 && route.Count > index + 1)
87                {
88                    remaining /= route[index].Value.DistanceMetersToPoint(route[index + 1].Value);
89                    remaining *= route[index + 1].ElapsedSeconds - route[index].ElapsedSeconds;
90                    return route.StartTime.AddSeconds(route[index].ElapsedSeconds + remaining);
91                }
92                else
93                {
94                    return route.StartTime.AddSeconds(route[index].ElapsedSeconds);
95                }
96            }
97    
98            public void CalculateSelectedRegion(out DateTime start, out DateTime end)
99            {
100                IRouteControl control = MetadataRouteControlLayer.Instances[0].Control;
101                IGPSRoute route = CollectionUtils.GetSingleItemOfType<IActivity>(MetadataActivityReportPages.View.SelectionProvider.SelectedItems).GPSRoute;
102                start = DateTime.MaxValue;
103                end = DateTime.MinValue;
104                for (int k = 0; k < control.SelectedItems.Count; k++)
105                {
106                    IRouteControlSelection selection = control.SelectedItems[k];
107                    if (selection == null || !selection.Item.DisplayRoute || selection.Item.Item == null)
108                    {
109                        return;
110                    }
111                    if (selection.DistanceMetersRanges != null && selection.DistanceMetersRanges.Count >= 1)
112                    {
113                        start = DateTimeMin(start, RouteTimeFromDistance(route, selection.DistanceMetersRanges[0].Lower));
114                        end = DateTimeMax(end, RouteTimeFromDistance(route, selection.DistanceMetersRanges[0].Upper));
115                    }
116                    else if (selection.TimeRanges != null && selection.TimeRanges.Count >= 1)
117                    {
118                        start = DateTimeMin(start, selection.TimeRanges[0].Lower);
119                        end = DateTimeMax(start, selection.TimeRanges[0].Upper);
120                    }
121                }
122                if (start == DateTime.MaxValue)
123                {
124                    start = DateTime.MinValue;
125                }
126                if (end == DateTime.MinValue)
127                {
128                    end = DateTime.MaxValue;
129                }
130            }
131    
132          public static IList<MetadataRouteControlLayer> Instances          public static IList<MetadataRouteControlLayer> Instances
133          {          {
134              get { return instances; }              get { return instances; }

Legend:
Removed from v.91  
changed lines
  Added in v.92

Managed by UCC Webmasters ViewVC Help
Powered by ViewVC 1.1.26