return rv;
}
+/**
+ * track_recalculate_bounds_last_tp:
+ * @trk: The track to consider the recalculation on
+ *
+ * A faster bounds check, since it only considers the last track point
+ */
+static void track_recalculate_bounds_last_tp ( VikTrack *trk )
+{
+ GList *tpl = g_list_last ( trk->trackpoints );
+
+ if ( tpl ) {
+ struct LatLon ll;
+ // See if this trackpoint increases the track bounds and update if so
+ vik_coord_to_latlon ( &(VIK_TRACKPOINT(tpl->data)->coord), &ll );
+ if ( ll.lat > trk->bbox.north )
+ trk->bbox.north = ll.lat;
+ if ( ll.lon < trk->bbox.west )
+ trk->bbox.west = ll.lon;
+ if ( ll.lat < trk->bbox.south )
+ trk->bbox.south = ll.lat;
+ if ( ll.lon > trk->bbox.east )
+ trk->bbox.east = ll.lon;
+ }
+}
+
+/**
+ * vik_track_add_trackpoint:
+ * @tr: The track to which the trackpoint will be added
+ * @tp: The trackpoint to add
+ * @recalculate: Whether to perform any associated properties recalculations
+ * Generally one should avoid recalculation via this method if adding lots of points
+ * (But ensure calculate_bounds() is called after adding all points!!)
+ *
+ * The trackpoint is added to the end of the existing trackpoint list
+ */
+void vik_track_add_trackpoint ( VikTrack *tr, VikTrackpoint *tp, gboolean recalculate )
+{
+ tr->trackpoints = g_list_append ( tr->trackpoints, tp );
+ if ( recalculate )
+ track_recalculate_bounds_last_tp ( tr );
+}
+
gdouble vik_track_get_length(const VikTrack *tr)
{
gdouble len = 0.0;
gulong vik_track_get_tp_count(const VikTrack *tr)
{
- gulong num = 0;
- GList *iter = tr->trackpoints;
- while ( iter )
- {
- num++;
- iter = iter->next;
- }
- return num;
+ return g_list_length(tr->trackpoints);
}
gulong vik_track_get_dup_point_count ( const VikTrack *tr )
pts[current_chunk] = current_gradient;
+ g_free ( altitudes );
+
return pts;
}
if (VIK_TRACKPOINT(iter->data)->timestamp > t_pos) {
if (iter->prev == NULL) /* first trackpoint */
break;
- time_t t_before = t_pos - VIK_TRACKPOINT(iter->prev)->timestamp;
+ time_t t_before = t_pos - VIK_TRACKPOINT(iter->prev->data)->timestamp;
time_t t_after = VIK_TRACKPOINT(iter->data)->timestamp - t_pos;
if (t_before <= t_after)
iter = iter->prev;
tp_iter = tp_iter->next;
}
- g_debug ( g_strdup_printf("Bounds of track: '%s' is: %f,%f to: %f,%f", trk->name, topleft.lat, topleft.lon, bottomright.lat, bottomright.lon ) );
+ g_debug ( "Bounds of track: '%s' is: %f,%f to: %f,%f", trk->name, topleft.lat, topleft.lon, bottomright.lat, bottomright.lon );
trk->bbox.north = topleft.lat;
trk->bbox.east = bottomright.lon;