]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktrack.c
Add Track->Split by Number of Points (as per SF#2847587 request).
[andy/viking.git] / src / viktrack.c
index 9ce1c0fb1fb919267825d4a1fd984bd09ddcffa6..e5d6fd47e84e92ac1fdac932a21337fa70b981cb 100644 (file)
@@ -90,7 +90,8 @@ void vik_track_free(VikTrack *tr)
   g_list_foreach ( tr->trackpoints, (GFunc) g_free, NULL );
   g_list_free( tr->trackpoints );
   if (tr->property_dialog)
   g_list_foreach ( tr->trackpoints, (GFunc) g_free, NULL );
   g_list_free( tr->trackpoints );
   if (tr->property_dialog)
-    gtk_widget_destroy ( GTK_WIDGET(tr->property_dialog) );
+    if ( GTK_IS_WIDGET(tr->property_dialog) )
+      gtk_widget_destroy ( GTK_WIDGET(tr->property_dialog) );
   g_free ( tr );
 }
 
   g_free ( tr );
 }
 
@@ -115,9 +116,12 @@ VikTrack *vik_track_copy ( const VikTrack *tr )
 VikTrackpoint *vik_trackpoint_new()
 {
   VikTrackpoint *tp = g_malloc0(sizeof(VikTrackpoint));
 VikTrackpoint *vik_trackpoint_new()
 {
   VikTrackpoint *tp = g_malloc0(sizeof(VikTrackpoint));
-  tp->extended = FALSE;
   tp->speed = NAN;
   tp->course = NAN;
   tp->speed = NAN;
   tp->course = NAN;
+  tp->altitude = VIK_DEFAULT_ALTITUDE;
+  tp->hdop = VIK_DEFAULT_DOP;
+  tp->vdop = VIK_DEFAULT_DOP;
+  tp->pdop = VIK_DEFAULT_DOP;
   return tp;
 }
 
   return tp;
 }
 
@@ -376,8 +380,10 @@ gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks )
   chunk_length = total_length / num_chunks;
 
   /* Zero chunk_length (eg, track of 2 tp with the same loc) will cause crash */
   chunk_length = total_length / num_chunks;
 
   /* Zero chunk_length (eg, track of 2 tp with the same loc) will cause crash */
-  if (chunk_length <= 0)
+  if (chunk_length <= 0) {
+    g_free(pts);
     return NULL;
     return NULL;
+  }
 
   current_dist = 0.0;
   current_area_under_curve = 0;
 
   current_dist = 0.0;
   current_area_under_curve = 0;
@@ -645,6 +651,84 @@ VikTrackpoint *vik_track_get_closest_tp_by_percentage_time ( VikTrack *tr, gdoub
   return VIK_TRACKPOINT(iter->data);
 }
 
   return VIK_TRACKPOINT(iter->data);
 }
 
+VikTrackpoint* vik_track_get_tp_by_max_speed ( const VikTrack *tr )
+{
+  gdouble maxspeed = 0.0, speed = 0.0;
+
+  if ( !tr->trackpoints )
+    return NULL;
+
+  GList *iter = tr->trackpoints;
+  VikTrackpoint *max_speed_tp = NULL;
+
+  while (iter) {
+    if (iter->prev) {
+      if ( VIK_TRACKPOINT(iter->data)->has_timestamp &&
+          VIK_TRACKPOINT(iter->prev->data)->has_timestamp &&
+          (! VIK_TRACKPOINT(iter->data)->newsegment) ) {
+       speed =  vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), &(VIK_TRACKPOINT(iter->prev->data)->coord) )
+         / ABS(VIK_TRACKPOINT(iter->data)->timestamp - VIK_TRACKPOINT(iter->prev->data)->timestamp);
+       if ( speed > maxspeed ) {
+         maxspeed = speed;
+         max_speed_tp = VIK_TRACKPOINT(iter->data);
+       }
+      }
+    }
+    iter = iter->next;
+  }
+  
+  if (!max_speed_tp)
+    return NULL;
+
+  return max_speed_tp;
+}
+
+VikTrackpoint* vik_track_get_tp_by_max_alt ( const VikTrack *tr )
+{
+  gdouble maxalt = -5000.0;
+  if ( !tr->trackpoints )
+    return NULL;
+
+  GList *iter = tr->trackpoints;
+  VikTrackpoint *max_alt_tp = NULL;
+
+  while (iter) {
+    if ( VIK_TRACKPOINT(iter->data)->altitude > maxalt ) {
+      maxalt = VIK_TRACKPOINT(iter->data)->altitude;
+      max_alt_tp = VIK_TRACKPOINT(iter->data);
+    }
+    iter = iter->next;
+  }
+
+  if (!max_alt_tp)
+    return NULL;
+
+  return max_alt_tp;
+}
+
+VikTrackpoint* vik_track_get_tp_by_min_alt ( const VikTrack *tr )
+{
+  gdouble minalt = 25000.0;
+  if ( !tr->trackpoints )
+    return NULL;
+
+  GList *iter = tr->trackpoints;
+  VikTrackpoint *min_alt_tp = NULL;
+
+  while (iter) {
+    if ( VIK_TRACKPOINT(iter->data)->altitude < minalt ) {
+      minalt = VIK_TRACKPOINT(iter->data)->altitude;
+      min_alt_tp = VIK_TRACKPOINT(iter->data);
+    }
+    iter = iter->next;
+  }
+
+  if (!min_alt_tp)
+    return NULL;
+
+  return min_alt_tp;
+}
+
 gboolean vik_track_get_minmax_alt ( const VikTrack *tr, gdouble *min_alt, gdouble *max_alt )
 {
   *min_alt = 25000;
 gboolean vik_track_get_minmax_alt ( const VikTrack *tr, gdouble *min_alt, gdouble *max_alt )
 {
   *min_alt = 25000;