From e7db3ed6e3902feabccf9914b037a53217874de6 Mon Sep 17 00:00:00 2001 From: Samuel Cowen Date: Wed, 4 Jun 2014 21:32:59 +1000 Subject: [PATCH] Added a length function to the track that returns the great circle length in meters. --- examples/editable_tracks.c | 2 +- src/osm-gps-map-track.c | 23 +++++++++++++++++++++++ src/osm-gps-map-track.h | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/examples/editable_tracks.c b/examples/editable_tracks.c index 40887a9..5a0df89 100644 --- a/examples/editable_tracks.c +++ b/examples/editable_tracks.c @@ -52,7 +52,7 @@ static int click_down_y = 0; static gboolean on_track_changed(GtkWidget* widget) { - printf("track has been edited\n"); + printf("new track length: %f\n", osm_gps_map_track_get_length(maptrack)); } static gboolean diff --git a/src/osm-gps-map-track.c b/src/osm-gps-map-track.c index f43b7f1..10b5543 100644 --- a/src/osm-gps-map-track.c +++ b/src/osm-gps-map-track.c @@ -29,6 +29,7 @@ **/ #include +#include #include "converter.h" #include "osm-gps-map-track.h" @@ -342,6 +343,28 @@ osm_gps_map_track_get_color (OsmGpsMapTrack *track, GdkRGBA *color) color->blue = track->priv->color.blue; } +double +osm_gps_map_track_get_length(OsmGpsMapTrack* track) +{ + GSList* points = track->priv->track; + double ret = 0; + OsmGpsMapPoint* point_a = NULL; + OsmGpsMapPoint* point_b = NULL; + + while(points) + { + point_a = point_b; + point_b = points->data; + if(point_a) + { + ret += acos(sin(point_a->rlat)*sin(point_b->rlat) + + cos(point_a->rlat)*cos(point_b->rlat)*cos(point_b->rlon-point_a->rlon)) * 6371109; //the mean raduis of earth + } + points = points->next; + } + return ret; +} + OsmGpsMapTrack * osm_gps_map_track_new (void) diff --git a/src/osm-gps-map-track.h b/src/osm-gps-map-track.h index 2abb17e..b8e94f1 100644 --- a/src/osm-gps-map-track.h +++ b/src/osm-gps-map-track.h @@ -80,11 +80,29 @@ void osm_gps_map_track_add_point (OsmGpsMapTrack *track, cons GSList * osm_gps_map_track_get_points (OsmGpsMapTrack *track); void osm_gps_map_track_get_color (OsmGpsMapTrack *track, GdkRGBA *color); +/** + * osm_gps_map_track_remove_point: + * @track (in): a #OsmGpsMapTrack + * @pos: Position of the point to remove + * + **/ void osm_gps_map_track_remove_point(OsmGpsMapTrack* track, int pos); + +/** + * + **/ int osm_gps_map_track_n_points(OsmGpsMapTrack* track); void osm_gps_map_track_insert_point(OsmGpsMapTrack* track, OsmGpsMapPoint* np, int pos); OsmGpsMapPoint* osm_gps_map_track_get_point(OsmGpsMapTrack* track, int pos); +/** + * osm_gps_map_track_get_length: + * @track (in): a #OsmGpsMapTrack + * + * Returns: the length of the track in meters. + **/ +double osm_gps_map_track_get_length(OsmGpsMapTrack* track); + G_END_DECLS