]> git.mxchange.org Git - flightgear.git/commitdiff
Expose the vertical flight path as a property
authorTorsten Dreyer <Torsten@t3r.de>
Mon, 18 Aug 2014 22:01:08 +0000 (00:01 +0200)
committerTorsten Dreyer <Torsten@t3r.de>
Mon, 18 Aug 2014 22:01:08 +0000 (00:01 +0200)
write the vertical flight path to /orientation/path-deg
zero means level flight, positive angles climb

Also use SGD_DEGREES_TO_RADIANS (and vice versa) for double computations
instead of the float constants

src/FDM/flight.cxx
src/FDM/flight.hxx

index 74bc1b5d98d6f9d8a0f8fea9b7178f8d427c9172..91a2b13342b7c06152a9c0e8f22b6be5040e8fc3 100644 (file)
@@ -297,6 +297,8 @@ FGInterface::bind ()
   fgSetArchivable("/orientation/heading-deg");
   _tiedProperties.Tie("/orientation/track-deg", this,
                       &FGInterface::get_Track); // read-only
+  _tiedProperties.Tie("/orientation/path-deg", this,
+                      &FGInterface::get_Path); // read-only
 
   // Body-axis "euler rates" (rotation speed, but in a funny
   // representation).
@@ -481,7 +483,7 @@ bool FGInterface::writeState(SGIOChannel* io)
 
 void FGInterface::_updatePositionM(const SGVec3d& cartPos)
 {
-    TrackComputer tracker( _state.track, _state.geodetic_position_v );
+    TrackComputer tracker( _state.track, _state.path, _state.geodetic_position_v );
     _state.cartesian_position_v = cartPos;
     _state.geodetic_position_v = SGGeod::fromCart(_state.cartesian_position_v);
     _state.geocentric_position_v = SGGeoc::fromCart(_state.cartesian_position_v);
@@ -492,7 +494,7 @@ void FGInterface::_updatePositionM(const SGVec3d& cartPos)
 
 void FGInterface::_updatePosition(const SGGeod& geod)
 {
-    TrackComputer tracker( _state.track, _state.geodetic_position_v );
+    TrackComputer tracker( _state.track, _state.path, _state.geodetic_position_v );
     _state.geodetic_position_v = geod;
     _state.cartesian_position_v = SGVec3d::fromGeod(_state.geodetic_position_v);
     _state.geocentric_position_v = SGGeoc::fromCart(_state.cartesian_position_v);
@@ -504,7 +506,7 @@ void FGInterface::_updatePosition(const SGGeod& geod)
 
 void FGInterface::_updatePosition(const SGGeoc& geoc)
 {
-    TrackComputer tracker( _state.track, _state.geodetic_position_v );
+    TrackComputer tracker( _state.track, _state.path, _state.geodetic_position_v );
     _state.geocentric_position_v = geoc;
     _state.cartesian_position_v = SGVec3d::fromGeoc(_state.geocentric_position_v);
     _state.geodetic_position_v = SGGeod::fromCart(_state.cartesian_position_v);
index fdb729aaa6bc18228462ae70bb1530bf6234a7e2..2d291b3cf98df637efaf195e1c202778ac3f7293 100644 (file)
@@ -99,18 +99,26 @@ class SGIOChannel;
  */
 class TrackComputer {
 public:
-  inline TrackComputer( double & track, const SGGeod & position ) : 
+  inline TrackComputer( double & track, double & path, const SGGeod & position ) : 
     _track( track ),
+    _path( path ),
     _position( position ),
     _prevPosition( position ) {
   }
 
   inline ~TrackComputer() {
     if( _prevPosition == _position ) return;
-    _track = SGGeodesy::courseDeg( _prevPosition, _position );
+//    _track = SGGeodesy::courseDeg( _prevPosition, _position );
+    double d = .0;
+    double distance = .0;
+    if( SGGeodesy::inverse( _prevPosition, _position, _track, d, distance ) ) {
+      d = _position.getElevationM() - _prevPosition.getElevationM();
+      _path = atan2( d, distance ) * SGD_RADIANS_TO_DEGREES;
+    }
   }
 private:
   double & _track;
+  double & _path;
   const SGGeod & _position;
   const SGGeod _prevPosition;
 };
@@ -194,6 +202,7 @@ private:
         double climb_rate;                // in feet per second
         double altitude_agl;
         double track;
+        double path;
     };
     
     FlightState _state;
@@ -306,17 +315,17 @@ public:
     
     void set_Phi_dot_degps(double x)
     {
-      _state.euler_rates_v[0] = x * SG_DEGREES_TO_RADIANS;
+      _state.euler_rates_v[0] = x * SGD_DEGREES_TO_RADIANS;
     }
     
     void set_Theta_dot_degps(double x)
     {
-      _state.euler_rates_v[1] = x * SG_DEGREES_TO_RADIANS;
+      _state.euler_rates_v[1] = x * SGD_DEGREES_TO_RADIANS;
     }
     
     void set_Psi_dot_degps(double x)
     {
-      _state.euler_rates_v[2] = x * SG_DEGREES_TO_RADIANS;
+      _state.euler_rates_v[2] = x * SGD_DEGREES_TO_RADIANS;
     }
     
     inline void _set_Geocentric_Rates( double lat, double lon, double rad ) {
@@ -349,7 +358,7 @@ public:
         _set_Geodetic_Position( lat, lon, _state.geodetic_position_v.getElevationFt());
     }
     inline void _set_Geodetic_Position( double lat, double lon, double alt ) {
-        TrackComputer tracker( _state.track, _state.geodetic_position_v );
+        TrackComputer tracker( _state.track, _state.path, _state.geodetic_position_v );
         _state.geodetic_position_v.setLatitudeRad(lat);
         _state.geodetic_position_v.setLongitudeRad(lon);
         _state.geodetic_position_v.setElevationFt(alt);
@@ -364,7 +373,7 @@ public:
     inline void _set_Alpha( double a ) { _state.alpha = a; }
     inline void _set_Beta( double b ) { _state.beta = b; }
     
-    inline void set_Alpha_deg( double a ) { _state.alpha = a * SG_DEGREES_TO_RADIANS; }
+    inline void set_Alpha_deg( double a ) { _state.alpha = a * SGD_DEGREES_TO_RADIANS; }
     
     inline void _set_Gamma_vert_rad( double gv ) { _state.gamma_vert_rad = gv; }
     inline void _set_Density( double d ) { _state.density = d; }
@@ -617,6 +626,7 @@ public:
     }
     inline double get_Altitude_AGL(void) const { return _state.altitude_agl; }
     inline double get_Track(void) const { return _state.track; }
+    inline double get_Path(void) const { return _state.path; }
 
     inline double get_Latitude_deg () const {
       return _state.geodetic_position_v.getLatitudeDeg();