X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmath%2FSGGeod.hxx;h=a7153334d5d78fe0e9061bde320270179279bfe4;hb=1f37095087fa7aa3d210ba134058b86c3bd6d69e;hp=a796861d51c4497aa9fff536b9677dae7cb0cabd;hpb=9be14a63b1b593b02b5cc3e82edb7a266ae3cbe7;p=simgear.git diff --git a/simgear/math/SGGeod.hxx b/simgear/math/SGGeod.hxx index a796861d..a7153334 100644 --- a/simgear/math/SGGeod.hxx +++ b/simgear/math/SGGeod.hxx @@ -10,10 +10,9 @@ // 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 Library General Public -// License along with this library; if not, write to the -// Free Software Foundation, Inc., 59 Temple Place - Suite 330, -// Boston, MA 02111-1307, USA. +// 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 SGGeod_H @@ -21,6 +20,10 @@ #include +#ifndef NO_OPENSCENEGRAPH_INTERFACE +#include +#endif + // #define SG_GEOD_NATIVE_DEGREE /// Class representing a geodetic location @@ -28,12 +31,6 @@ class SGGeod { public: /// Default constructor, initializes the instance to lat = lon = elev = 0 SGGeod(void); - /// Initialize from a cartesian vector assumed to be in meters - /// Note that this conversion is relatively expensive to compute - SGGeod(const SGVec3& cart); - /// Initialize from a geocentric position - /// Note that this conversion is relatively expensive to compute - SGGeod(const SGGeoc& geoc); /// Factory from angular values in radians and elevation is 0 static SGGeod fromRad(double lon, double lat); @@ -47,6 +44,17 @@ public: static SGGeod fromRadM(double lon, double lat, double elevation); /// Factory from angular values in degrees and elevation in m static SGGeod fromDegM(double lon, double lat, double elevation); + /// Factory from an other SGGeod and a different elevation in m + static SGGeod fromGeodM(const SGGeod& geod, double elevation); + /// Factory from an other SGGeod and a different elevation in ft + static SGGeod fromGeodFt(const SGGeod& geod, double elevation); + /// 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 SGGeod fromCart(const SGVec3& cart); + /// Factory to convert position from a geocentric position + /// Note that this conversion is relatively expensive to compute + static SGGeod fromGeoc(const SGGeoc& geoc); /// Return the geodetic longitude in radians double getLongitudeRad(void) const; @@ -78,13 +86,30 @@ public: /// Set the geodetic elevation from the argument given in feet void setElevationFt(double elevation); + // Compare two geodetic positions for equality + bool operator == ( const SGGeod & other ) const; + +#ifndef NO_OPENSCENEGRAPH_INTERFACE + // Create a local coordinate frame in the earth-centered frame of + // reference. X points north, Z points down. + // makeSimulationFrameRelative() only includes rotation. + osg::Matrix makeSimulationFrameRelative() const; + osg::Matrix makeSimulationFrame() const; + + // Create a Z-up local coordinate frame in the earth-centered frame + // of reference. This is what scenery models, etc. expect. + // makeZUpFrameRelative() only includes rotation. + osg::Matrix makeZUpFrameRelative() const; + osg::Matrix makeZUpFrame() const; +#endif 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 /// that purpose SGGeod(double lon, double lat, double elevation); - /// The actual data, angles in degree, elevation in meters + //// FIXME: wrong comment! + /// The actual data, angles in degrees, elevation in meters /// The rationale for storing the values in degrees is that most code places /// in flightgear/terragear use degrees as a nativ input and output value. /// The places where it makes sense to use radians is when we convert @@ -108,20 +133,6 @@ SGGeod::SGGeod(double lon, double lat, double elevation) : { } -inline -SGGeod::SGGeod(const SGVec3& cart) -{ - SGGeodesy::SGCartToGeod(cart, *this); -} - -inline -SGGeod::SGGeod(const SGGeoc& geoc) -{ - SGVec3 cart; - SGGeodesy::SGGeocToCart(geoc, cart); - SGGeodesy::SGCartToGeod(cart, *this); -} - inline SGGeod SGGeod::fromRad(double lon, double lat) @@ -192,6 +203,40 @@ SGGeod::fromDegM(double lon, double lat, double elevation) #endif } +inline +SGGeod +SGGeod::fromGeodM(const SGGeod& geod, double elevation) +{ + return SGGeod(geod._lon, geod._lat, elevation); +} + +inline +SGGeod +SGGeod::fromGeodFt(const SGGeod& geod, double elevation) +{ + return SGGeod(geod._lon, geod._lat, elevation*SG_FEET_TO_METER); +} + +inline +SGGeod +SGGeod::fromCart(const SGVec3& cart) +{ + SGGeod geod; + SGGeodesy::SGCartToGeod(cart, geod); + return geod; +} + +inline +SGGeod +SGGeod::fromGeoc(const SGGeoc& geoc) +{ + SGVec3 cart; + SGGeodesy::SGGeocToCart(geoc, cart); + SGGeod geod; + SGGeodesy::SGCartToGeod(cart, geod); + return geod; +} + inline double SGGeod::getLongitudeRad(void) const @@ -308,6 +353,15 @@ SGGeod::setElevationFt(double elevation) _elevation = elevation*SG_FEET_TO_METER; } +inline +bool +SGGeod::operator == ( const SGGeod & other ) const +{ + return _lon == other._lon && + _lat == other._lat && + _elevation == other._elevation; +} + /// Output to an ostream template inline