X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Froute%2Fwaypoint.cxx;h=73669037e0f82d7d2fdb730ef1c5d54663e052c5;hb=7bdb530440d1dadc991f305edb1b70ec85f27451;hp=316b70b33c3d1a357f45182375d98cfa804e9874;hpb=cd5765be1eb35f0608605de7a24f70a7bf5d0ba9;p=simgear.git diff --git a/simgear/route/waypoint.cxx b/simgear/route/waypoint.cxx index 316b70b3..73669037 100644 --- a/simgear/route/waypoint.cxx +++ b/simgear/route/waypoint.cxx @@ -16,37 +16,50 @@ // // 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$ +#ifdef HAVE_CONFIG_H +# include +#endif -#include #include #include "waypoint.hxx" +using std::string; // Constructor SGWayPoint::SGWayPoint( const double lon, const double lat, const double alt, - const modetype m, const string s ) { - target_lon = lon; - target_lat = lat; - target_alt = alt; - mode = m; - id = s; + const modetype, const string& s, const string& n ) : + pos(SGGeod::fromDegM(lon, lat, alt)), + id(s), + name(n), + _distance(0.0), + _track(0.0), + _speed(0.0) +{ } - -SGWayPoint::SGWayPoint() { - SGWayPoint( 0.0, 0.0, 0.0, WGS84, "" ); +SGWayPoint::SGWayPoint(const SGGeod& geod, const string& s, const string& n ) : + pos(geod), + id(s), + name(n), + _distance(0.0), + _track(0.0), + _speed(0.0) +{ } - // Destructor SGWayPoint::~SGWayPoint() { } +void SGWayPoint::CourseAndDistance(const SGGeod& cur, double& course, double& dist ) const { + double reverse; + SGGeodesy::inverse(cur, pos, course, reverse, dist); +} // Calculate course and distances. For WGS84 and SPHERICAL // coordinates lat, lon, and course are in degrees, alt and distance @@ -55,35 +68,12 @@ SGWayPoint::~SGWayPoint() { void SGWayPoint::CourseAndDistance( const double cur_lon, const double cur_lat, const double cur_alt, - double *course, double *distance ) const { - if ( mode == WGS84 ) { - double reverse; - geo_inverse_wgs_84( cur_alt, cur_lat, cur_lon, target_lat, target_lon, - course, &reverse, distance ); - } else if ( mode == SPHERICAL ) { - Point3D current( cur_lon * DEG_TO_RAD, cur_lat * DEG_TO_RAD, 0.0 ); - Point3D target( target_lon * DEG_TO_RAD, target_lat * DEG_TO_RAD, 0.0 ); - calc_gc_course_dist( current, target, course, distance ); - *course = 360.0 - *course * RAD_TO_DEG; - } else if ( mode == CARTESIAN ) { - double dx = target_lon - cur_lon; - double dy = target_lat - cur_lat; - *course = -atan2( dy, dx ) * RAD_TO_DEG - 90; - while ( *course < 0 ) { - *course += 360.0; - } - while ( *course > 360.0 ) { - *course -= 360.0; - } - *distance = sqrt( dx * dx + dy * dy ); - } + double *course, double *dist ) const { + CourseAndDistance(SGGeod::fromDegM(cur_lon, cur_lat, cur_alt), *course, *dist); } // Calculate course and distances between two waypoints void SGWayPoint::CourseAndDistance( const SGWayPoint &wp, - double *course, double *distance ) const { - CourseAndDistance( wp.get_target_lon(), - wp.get_target_lat(), - wp.get_target_alt(), - course, distance ); + double *course, double *dist ) const { + CourseAndDistance( wp.get_target(), *course, *dist ); }