]> git.mxchange.org Git - simgear.git/blobdiff - simgear/math/SGGeod.hxx
Add convenience function to keep position with just an other elevation.
[simgear.git] / simgear / math / SGGeod.hxx
index 3fb6659b85163f0acafd69c1ce412d7b6b3d26de..144ee347b1c6e58b2ef61ed6cfa34b167fed62e3 100644 (file)
@@ -20,6 +20,8 @@
 
 #include <simgear/constants.h>
 
+#include <osg/Matrix>
+
 // #define SG_GEOD_NATIVE_DEGREE
 
 /// Class representing a geodetic location
@@ -27,12 +29,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<double>& 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);
@@ -46,6 +42,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<double>& 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;
@@ -77,6 +84,18 @@ public:
   /// Set the geodetic elevation from the argument given in feet
   void setElevationFt(double elevation);
 
+  // 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();
+  osg::Matrix makeSimulationFrame();    
+
+  // 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();
+  osg::Matrix makeZUpFrame();    
 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
@@ -107,20 +126,6 @@ SGGeod::SGGeod(double lon, double lat, double elevation) :
 {
 }
 
-inline
-SGGeod::SGGeod(const SGVec3<double>& cart)
-{
-  SGGeodesy::SGCartToGeod(cart, *this);
-}
-
-inline
-SGGeod::SGGeod(const SGGeoc& geoc)
-{
-  SGVec3<double> cart;
-  SGGeodesy::SGGeocToCart(geoc, cart);
-  SGGeodesy::SGCartToGeod(cart, *this);
-}
-
 inline
 SGGeod
 SGGeod::fromRad(double lon, double lat)
@@ -191,6 +196,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<double>& cart)
+{
+  SGGeod geod;
+  SGGeodesy::SGCartToGeod(cart, geod);
+  return geod;
+}
+
+inline
+SGGeod
+SGGeod::fromGeoc(const SGGeoc& geoc)
+{
+  SGVec3<double> cart;
+  SGGeodesy::SGGeocToCart(geoc, cart);
+  SGGeod geod;
+  SGGeodesy::SGCartToGeod(cart, geod);
+  return geod;
+}
+
 inline
 double
 SGGeod::getLongitudeRad(void) const