]> git.mxchange.org Git - flightgear.git/commitdiff
Fixed the initial location so that geodetic latitude and ASL are kept in sync.
authorBertrand Coconnier <bcoconni@users.sourceforge.net>
Sun, 28 Aug 2016 10:23:17 +0000 (12:23 +0200)
committerRoland Haeder <roland@mxchange.org>
Thu, 22 Sep 2016 21:27:49 +0000 (23:27 +0200)
src/FDM/JSBSim/JSBSim.cxx
src/FDM/JSBSim/initialization/FGInitialCondition.cpp
src/FDM/JSBSim/initialization/FGInitialCondition.h

index 167c3c249cd1b56cef6189dc52100644e2eb381c..745f9ad9782ef3a6f88edbe301efe1eb5cb3bb48 100644 (file)
@@ -1023,16 +1023,17 @@ void FGJSBsim::set_Latitude(double lat)
   SG_LOG(SG_FLIGHT,SG_INFO,"FGJSBsim::set_Latitude: " << lat );
   SG_LOG(SG_FLIGHT,SG_INFO," cur alt (ft) =  " << alt );
 
-  sgGeodToGeoc( lat, alt * SG_FEET_TO_METER,
-                    &sea_level_radius_meters, &lat_geoc );
+  if (needTrim)
+    fgic->SetGeodLatitudeRadIC( lat );
+  else {
+    sgGeodToGeoc( lat, alt * SG_FEET_TO_METER,
+                  &sea_level_radius_meters, &lat_geoc );
 
-  double sea_level_radius_ft = sea_level_radius_meters * SG_METER_TO_FEET;
-  _set_Sea_level_radius( sea_level_radius_ft );
+    double sea_level_radius_ft = sea_level_radius_meters * SG_METER_TO_FEET;
+    _set_Sea_level_radius( sea_level_radius_ft );
 
-  if (needTrim)
-    fgic->SetLatitudeRadIC( lat_geoc );
-  else
     Propagate->SetLatitude(lat_geoc);
+  }
 
   FGInterface::set_Latitude(lat);
 }
@@ -1055,13 +1056,8 @@ void FGJSBsim::set_Altitude(double alt)
 {
   SG_LOG(SG_FLIGHT,SG_INFO, "FGJSBsim::set_Altitude: " << alt );
 
-  if (needTrim) {
-    FGLocation position = fgic->GetPosition();
-
-    position.SetPositionGeodetic(0.0, position.GetGeodLatitudeRad(), alt);
-    fgic->SetAltitudeASLFtIC(position.GetAltitudeASL());
-//  fgic->SetLatitudeRadIC(position.GetLatitude());
-  }
+  if (needTrim)
+    fgic->SetAltitudeASLFtIC(alt);
   else
     Propagate->SetAltitudeASL(alt);
 
index c5eea1a2f8d78ccb88faa7edd139ae51c125e5d7..d71317ce1a95eb5ddc51f903815b8ee35ec8af8f 100644 (file)
@@ -739,6 +739,17 @@ void FGInitialCondition::SetAltitudeASLFtIC(double alt)
 
 //******************************************************************************
 
+void FGInitialCondition::SetGeodLatitudeRadIC(double geodLatitude)
+{
+  double h = ComputeGeodAltitude(geodLatitude);
+  double lon = position.GetLongitude();
+
+  position.SetPositionGeodetic(lon, geodLatitude, h);
+  lastLatitudeSet = setgeod;
+}
+
+//******************************************************************************
+
 void FGInitialCondition::SetLatitudeRadIC(double lat)
 {
   double altitude;
index c5428b7adca80793bdd449520bbbbbdcdcb88b27..02af89c060d87411ad91023331df3a2eac87a3d8 100644 (file)
@@ -592,6 +592,12 @@ public:
       @param lat Initial latitude in radians */
   void SetLatitudeRadIC(double lat);
 
+  /** Sets the initial geodetic latitude.
+      This method modifies the geodetic altitude in order to keep the altitude
+      above sea level unchanged.
+      @param glat Initial geodetic latitude in radians */
+  void SetGeodLatitudeRadIC(double glat);
+
   /** Sets the initial longitude.
       @param lon Initial longitude in radians */
   void SetLongitudeRadIC(double lon);