X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2FSGGeoc.hxx;h=cb603bc4bc89457392eea98c1f3861772f4c69e5;hb=914d3e6a2b323cf9f186cbef2aef7865ea07b309;hp=b7d0a191cf695055820fba972aeec95ae1dde86b;hpb=75f817b39c693b2679ebc4b95bf554e65307c067;p=simgear.git diff --git a/simgear/math/SGGeoc.hxx b/simgear/math/SGGeoc.hxx index b7d0a191..cb603bc4 100644 --- a/simgear/math/SGGeoc.hxx +++ b/simgear/math/SGGeoc.hxx @@ -1,3 +1,20 @@ +// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// + #ifndef SGGeoc_H #define SGGeoc_H @@ -10,12 +27,6 @@ class SGGeoc { public: /// Default constructor, initializes the instance to lat = lon = lat = 0 SGGeoc(void); - /// Initialize from a cartesian vector assumed to be in meters - /// Note that this conversion is relatively expensive to compute - SGGeoc(const SGVec3& cart); - /// Initialize from a geodetic position - /// Note that this conversion is relatively expensive to compute - SGGeoc(const SGGeod& geod); /// Factory from angular values in radians and radius in ft static SGGeoc fromRadFt(double lon, double lat, double radius); @@ -25,6 +36,13 @@ public: static SGGeoc fromRadM(double lon, double lat, double radius); /// Factory from angular values in degrees and radius in m static SGGeoc fromDegM(double lon, double lat, double radius); + /// Factory to convert position from a cartesian position assumed to be + /// in wgs84 measured in meters + /// Note that this conversion is relatively expensive to compute + static SGGeoc fromCart(const SGVec3& cart); + /// Factory to convert position from a geodetic position + /// Note that this conversion is relatively expensive to compute + static SGGeoc fromGeod(const SGGeod& geod); /// Return the geocentric longitude in radians double getLongitudeRad(void) const; @@ -56,6 +74,13 @@ public: /// Set the geocentric radius from the argument given in feet void setRadiusFt(double radius); + SGGeoc advanceRadM(double course, double distance) const; + static double courseRad(const SGGeoc& from, const SGGeoc& to); + static double courseDeg(const SGGeoc& from, const SGGeoc& to); + static double distanceM(const SGGeoc& from, const SGGeoc& to); + + // Compare two geocentric positions for equality + bool operator == ( const SGGeoc & other ) const; private: /// This one is private since construction is not unique if you do /// not know the units of the arguments, use the factory methods for @@ -86,20 +111,6 @@ SGGeoc::SGGeoc(double lon, double lat, double radius) : { } -inline -SGGeoc::SGGeoc(const SGVec3& cart) -{ - SGGeodesy::SGCartToGeoc(cart, *this); -} - -inline -SGGeoc::SGGeoc(const SGGeod& geod) -{ - SGVec3 cart; - SGGeodesy::SGGeodToCart(geod, cart); - SGGeodesy::SGCartToGeoc(cart, *this); -} - inline SGGeoc SGGeoc::fromRadFt(double lon, double lat, double radius) @@ -148,6 +159,26 @@ SGGeoc::fromDegM(double lon, double lat, double radius) #endif } +inline +SGGeoc +SGGeoc::fromCart(const SGVec3& cart) +{ + SGGeoc geoc; + SGGeodesy::SGCartToGeoc(cart, geoc); + return geoc; +} + +inline +SGGeoc +SGGeoc::fromGeod(const SGGeod& geod) +{ + SGVec3 cart; + SGGeodesy::SGGeodToCart(geod, cart); + SGGeoc geoc; + SGGeodesy::SGCartToGeoc(cart, geoc); + return geoc; +} + inline double SGGeoc::getLongitudeRad(void) const @@ -177,7 +208,7 @@ SGGeoc::getLongitudeDeg(void) const #ifdef SG_GEOC_NATIVE_DEGREE return _lon; #else - return _lon*SGD_DEGREES_TO_RADIANS; + return _lon*SGD_RADIANS_TO_DEGREES; #endif } @@ -188,7 +219,7 @@ SGGeoc::setLongitudeDeg(double lon) #ifdef SG_GEOC_NATIVE_DEGREE _lon = lon; #else - _lon = lon*SGD_RADIANS_TO_DEGREES; + _lon = lon*SGD_DEGREES_TO_RADIANS; #endif } @@ -221,7 +252,7 @@ SGGeoc::getLatitudeDeg(void) const #ifdef SG_GEOC_NATIVE_DEGREE return _lat; #else - return _lat*SGD_DEGREES_TO_RADIANS; + return _lat*SGD_RADIANS_TO_DEGREES; #endif } @@ -232,7 +263,7 @@ SGGeoc::setLatitudeDeg(double lat) #ifdef SG_GEOC_NATIVE_DEGREE _lat = lat; #else - _lat = lat*SGD_RADIANS_TO_DEGREES; + _lat = lat*SGD_DEGREES_TO_RADIANS; #endif } @@ -264,6 +295,45 @@ SGGeoc::setRadiusFt(double radius) _radius = radius*SG_FEET_TO_METER; } +inline +SGGeoc +SGGeoc::advanceRadM(double course, double distance) const +{ + SGGeoc result; + SGGeodesy::advanceRadM(*this, course, distance, result); + return result; +} + +inline +double +SGGeoc::courseRad(const SGGeoc& from, const SGGeoc& to) +{ + return SGGeodesy::courseRad(from, to); +} + +inline +double +SGGeoc::courseDeg(const SGGeoc& from, const SGGeoc& to) +{ + return SGMiscd::rad2deg(courseRad(from, to)); +} + +inline +double +SGGeoc::distanceM(const SGGeoc& from, const SGGeoc& to) +{ + return SGGeodesy::distanceM(from, to); +} + +inline +bool +SGGeoc::operator == ( const SGGeoc & other ) const +{ + return _lon == other._lon && + _lat == other._lat && + _radius == other._radius; +} + /// Output to an ostream template inline