X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Froute%2Fwaypoint.hxx;h=275d648e6811b822ed4941dd92d74eb1e3ebbe32;hb=3346bfc9a8e01a81bddab503664e0399d57e4d5e;hp=4f66f89fa123ba671034f94d5bf9125ce2c170ff;hpb=cd5765be1eb35f0608605de7a24f70a7bf5d0ba9;p=simgear.git diff --git a/simgear/route/waypoint.hxx b/simgear/route/waypoint.hxx index 4f66f89f..275d648e 100644 --- a/simgear/route/waypoint.hxx +++ b/simgear/route/waypoint.hxx @@ -1,5 +1,8 @@ -// waypoint.hxx -- Class to hold data and return info relating to a waypoint -// +/** + * \file waypoint.hxx + * Provides a class to manage waypoints + */ + // Written by Curtis Olson, started September 2000. // // Copyright (C) 2000 Curtis L. Olson - curt@hfrl.umn.edu @@ -16,7 +19,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -24,72 +27,145 @@ #ifndef _WAYPOINT_HXX #define _WAYPOINT_HXX - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -#ifdef HAVE_CONFIG_H -# include -#endif - #include -#include STL_STRING +#include +#include + +#include -FG_USING_STD(string); +/** + * A class to manage waypoints. + */ class SGWayPoint { public: + /** + * Waypoint mode. + *
  • WGS84 requests all bearing and distance math be done assuming a + * WGS84 ellipsoid world. This is the most expensive computationally, + * but also the most accurate. + *
  • SPHERICAL requests all bearing and distance math be done assuming + * the world is a perfect sphere. This is less compuntationally + * expensive than using wgs84 math and still a fairly good + * approximation of the real world, especially over shorter distances. + */ enum modetype { WGS84 = 0, - SPHERICAL = 1, - CARTESIAN = 2 }; private: - - modetype mode; - - double target_lon; - double target_lat; - double target_alt; - double distance; - - string id; - + SGGeod pos; + std::string id; + std::string name; + + // route data associated with the waypoint + double _distance; + double _track; + double _speed; + public: - SGWayPoint(); - SGWayPoint( const double lon, const double lat, const double alt, - const modetype m = WGS84, const string s = "" ); + /** + * Construct a waypoint + * @param lon destination longitude + * @param lat destination latitude + * @param alt target altitude + * @param mode type of coordinates/math to use + * @param s waypoint identifier + * @param n waypoint name + */ + SGWayPoint( const double lon = 0.0, const double lat = 0.0, + const double alt = 0.0, const modetype m = WGS84, + const std::string& s = "", const std::string& n = "" ); + + /** + * Construct from a geodetic position, in WGS84 coordinates + */ + SGWayPoint(const SGGeod& pos, const std::string& s, const std::string& n); + + /** Destructor */ ~SGWayPoint(); - // Calculate course and distances. For WGS84 and SPHERICAL - // coordinates lat, lon, and course are in degrees, alt and - // distance are in meters. For CARTESIAN coordinates x = lon, y = - // lat. Course is in degrees and distance is in what ever units x - // and y are in. + /** + * Calculate course and distances. For WGS84 and SPHERICAL + * coordinates lat, lon, and course are in degrees, alt and + * distance are in meters. For CARTESIAN coordinates x = lon, y = + * lat. Course is in degrees and distance is in what ever units x + * and y are in. + * @param cur_lon (in) current longitude + * @param cur_lat (in) current latitude + * @param cur_alt (in) current altitude + * @param course (out) heading from current location to this waypoint + * @param dist (out) distance from current location to this waypoint + */ void CourseAndDistance( const double cur_lon, const double cur_lat, const double cur_alt, - double *course, double *distance ) const; - - // Calculate course and distances between two waypoints + double *course, double *dist ) const; + + void CourseAndDistance(const SGGeod& current, + double& course, double& dist ) const; + + /** + * Calculate course and distances between a specified starting waypoint + * and this waypoint. + * @param wp (in) original waypoint + * @param course (out) heading from current location to this waypoint + * @param dist (out) distance from current location to this waypoint + */ void CourseAndDistance( const SGWayPoint &wp, - double *course, double *distance ) const; - - inline modetype get_mode() const { return mode; } - inline double get_target_lon() const { return target_lon; } - inline double get_target_lat() const { return target_lat; } - inline double get_target_alt() const { return target_alt; } - inline double get_distance() const { return distance; } - inline string get_id() const { return id; } + double *course, double *dist ) const; + + /** @return waypoint longitude */ + inline double get_target_lon() const { return pos.getLongitudeDeg(); } + + /** @return waypoint latitude */ + inline double get_target_lat() const { return pos.getLatitudeDeg(); } + + /** @return waypoint altitude */ + inline double get_target_alt() const { return pos.getElevationM(); } + + inline const SGGeod& get_target() const { return pos; } + + /** + * + */ + inline void setTargetAltFt(double elev) + { pos.setElevationFt(elev); } + + /** + * This value is not calculated by this class. It is simply a + * placeholder for the user to stash a distance value. This is useful + * when you stack waypoints together into a route. You can calculate the + * distance from the previous waypoint once and save it here. Adding up + * all the distances here plus the distance to the first waypoint gives you + * the total route length. Note, you must update this value yourself, this + * is for your convenience only. + * @return waypoint distance holder (what ever the user has stashed here) + */ + inline double get_distance() const { return _distance; } + + /** + * Set the waypoint distance value to a value of our choice. + * @param d distance + */ + inline void set_distance( double d ) { _distance = d; } + + inline double get_track() const { return _track; } + inline void set_track(double t) { _track = t; } + + inline double get_speed() const { return _speed; } + inline void set_speed(double v) { _speed = v; } + + /** @return waypoint id */ + inline const std::string& get_id() const { return id; } + + /** @return waypoint name */ + inline const std::string& get_name() const { return name; } - inline void set_distance( double d ) { distance = d; } };