X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/7432fddfbf2b5e1a654477c664998674d53003e8..057a78bcfaa6b6a962e4dde9690cb755a61b481e:/src/viktrack.c diff --git a/src/viktrack.c b/src/viktrack.c index b5f1b768..ba517cc0 100644 --- a/src/viktrack.c +++ b/src/viktrack.c @@ -29,6 +29,7 @@ #include "vikcoord.h" #include "viktrack.h" #include "globals.h" +#include "dems.h" VikTrack *vik_track_new() { @@ -325,6 +326,9 @@ gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks ) GList *iter = tr->trackpoints; + if (!iter->next) /* one-point track */ + return NULL; + { /* test if there's anything worth calculating */ gboolean okay = FALSE; while ( iter ) @@ -338,7 +342,7 @@ gdouble *vik_track_make_elevation_map ( const VikTrack *tr, guint16 num_chunks ) return NULL; } - + iter = tr->trackpoints; g_assert ( num_chunks < 16000 ); @@ -545,17 +549,18 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks ) int i, pt_count, numpts, spline; GList *iter; spline_coeff_t *p; - GList *mytr; if ( ! tr->trackpoints ) return NULL; g_assert ( num_chunks < 16000 ); +#ifdef XXXXXXXXXXXXXXXXXX iter = tr->trackpoints; while (iter) { } +#endif /*XXXXXXXXXXXXXXXXXX*/ t1 = VIK_TRACKPOINT(tr->trackpoints->data)->timestamp; t2 = VIK_TRACKPOINT(g_list_last(tr->trackpoints)->data)->timestamp; @@ -565,7 +570,7 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks ) return NULL; if (duration < 0) { - fprintf(stderr, "negative duration: unsorted trackpoint timestamps?\n"); + g_warning("negative duration: unsorted trackpoint timestamps?\n"); return NULL; } pt_count = vik_track_get_tp_count(tr); @@ -591,13 +596,6 @@ gdouble *vik_track_make_speed_map ( const VikTrack *tr, guint16 num_chunks ) compute_spline(numpts, t, s, p); - /* - printf("Got spline\n"); - for (i=0; itrackpoints ) { GList *iter = tr->trackpoints->next; + GList *last_iter = NULL; while (iter) { current_inc = vik_coord_diff ( &(VIK_TRACKPOINT(iter->data)->coord), @@ -647,19 +645,17 @@ VikCoord *vik_track_get_closest_tp_by_percentage_dist ( VikTrack *tr, gdouble re current_dist += current_inc; if ( current_dist >= dist ) break; + last_iter = iter; iter = iter->next; } + if (!iter) /* passing the end the track */ + return (last_iter ? last_iter->data : NULL); /* we've gone past the dist already, was prev trackpoint closer? */ /* should do a vik_coord_average_weighted() thingy. */ if ( iter->prev && abs(current_dist-current_inc-dist) < abs(current_dist-dist) ) iter = iter->prev; - - - rv = g_malloc(sizeof(VikCoord)); - *rv = VIK_TRACKPOINT(iter->data)->coord; - - return rv; + return VIK_TRACKPOINT(iter->data); } return NULL; @@ -747,3 +743,32 @@ VikTrack *vik_track_unmarshall (guint8 *data, guint datalen) return new_tr; } +void vik_track_apply_dem_data ( VikTrack *tr ) +{ + GList *tp_iter; + gint16 elev; + tp_iter = tr->trackpoints; + while ( tp_iter ) { + /* TODO: of the 4 possible choices we have for choosing an elevation + * (trackpoint in between samples), choose the one with the least elevation change + * as the last */ + elev = a_dems_get_elev_by_coord ( &(VIK_TRACKPOINT(tp_iter->data)->coord) ); + if ( elev != VIK_DEM_INVALID_ELEVATION ) + VIK_TRACKPOINT(tp_iter->data)->altitude = elev; + tp_iter = tp_iter->next; + } +} + +/* appends t2 to t1, leaving t2 with no trackpoints */ +void vik_track_steal_and_append_trackpoints ( VikTrack *t1, VikTrack *t2 ) +{ + if ( t1->trackpoints ) { + GList *tpiter = t1->trackpoints; + while ( tpiter->next ) + tpiter = tpiter->next; + tpiter->next = t2->trackpoints; + t2->trackpoints->prev = tpiter; + } else + t1->trackpoints = t2->trackpoints; + t2->trackpoints = NULL; +}