]> git.mxchange.org Git - flightgear.git/commitdiff
mk-viii: tweak some values (according to spec), improve bias calculation.
authorChristian Schmitt <chris@ilovelinux.de>
Fri, 29 Mar 2013 19:17:27 +0000 (20:17 +0100)
committerChristian Schmitt <chris@ilovelinux.de>
Fri, 29 Mar 2013 19:39:00 +0000 (20:39 +0100)
Should now give less unjustified "too low - terrain" messages.

src/Instrumentation/mk_viii.cxx
src/Instrumentation/mk_viii.hxx

index 2c284998130e44dbf1c2dbc14affd1e1a0e9f5ba..b912cc36ea4392575d196f435dbc9686c9254952 100644 (file)
@@ -4287,20 +4287,16 @@ MK_VIII::TCFHandler::update_runway ()
          double half_length_m = _runway->lengthM() * 0.5;
          runway.half_length = half_length_m * SG_METER_TO_NM;
 
-         //           ________________
-         //          |                |
-         //    h1>>> |  e1<<<<<<<<e0  | <<<h0
-         //          |________________|
+         // _________
+         //          |
+         //  <<<<e0  | <<<h0
+         // _________|
 
-         // get heading to runway threshold (h0) and end (h1)
-         runway.edges[0].heading = _runway->headingDeg();
-         runway.edges[1].heading = _runway->reciprocalRunway()->headingDeg();
+         // get heading of runway end (h0)
+         runway.edge.heading = _runway->headingDeg();
 
          // get position of runway threshold (e0)
-          runway.edges[0].position = _runway->begin();
-
-         // get position of runway end (e1)
-          runway.edges[1].position = _runway->end();
+          runway.edge.position = _runway->begin();
 
           // get cartesian coordinates of both runway ends
           runway.bias_points[0] = _runway->cart();
@@ -4328,7 +4324,9 @@ bool
 MK_VIII::TCFHandler::is_inside_bias_area ()
 {
   double half_bias_width_m = k * SG_NM_TO_METER + runway.half_width_m;
-  SGVec3d cpos = SGVec3d::fromGeod(  SGGeod::fromDeg(mk_data(gps_longitude).get(), mk_data(gps_latitude).get()) );
+  SGVec3d cpos = SGVec3d::fromGeod(  SGGeod::fromDegFt(mk_data(gps_longitude).get(),
+                                                       mk_data(gps_latitude).get(),
+                                                       runway.elevation) );
   SGLineSegmentd bias_line = SGLineSegmentd(runway.bias_points[0], runway.bias_points[1]);
   return dist(cpos, bias_line) < half_bias_width_m;
 }
@@ -4337,67 +4335,53 @@ bool
 MK_VIII::TCFHandler::is_tcf ()
 {
   if (mk_data(radio_altitude).get() > 10)
+  {
+    if (has_runway)
     {
-      if (has_runway)
-       {
-         double distance = SGGeodesy::distanceNm( SGGeod::fromDeg(mk_data(gps_longitude).get(),
-                                                                   mk_data(gps_latitude).get()),
-                                                   runway.center);
-         // distance to the inner envelope edge
-         double edge_distance = distance - runway.half_length - k;
+      double distance = SGGeodesy::distanceNm( SGGeod::fromDegFt(mk_data(gps_longitude).get(),
+                                                                 mk_data(gps_latitude).get(),
+                                                                 runway.elevation),
+                                               runway.center);
 
-         if (edge_distance >= 15)
-           {
-             if (mk_data(radio_altitude).get() < 700)
-               return true;
-           }
-         else if (edge_distance >= 12)
-           {
-             if (mk_data(radio_altitude).get() < 100 * edge_distance - 800)
-               return true;
-           }
-         else if (edge_distance >= 4)
-           {
-             if (mk_data(radio_altitude).get() < 400)
-               return true;
-           }
-         else if (edge_distance >= 2.45)
-           {
-             if (mk_data(radio_altitude).get() < 66.666667 * edge_distance + 133.33333)
-               return true;
-           }
-         else
-           {
-             if (is_inside_edge_triangle(&runway.edges[0]) || is_inside_edge_triangle(&runway.edges[1]))
-               {
-                 if (edge_distance >= 1)
-                   {
-                     if (mk_data(radio_altitude).get() < 66.666667 * edge_distance + 133.33333)
-                       return true;
-                   }
-                 else if (edge_distance >= 0.05)
-                   {
-                     if (mk_data(radio_altitude).get() < 200 * edge_distance)
-                       return true;
-                   }
-               }
-             else
-               {
-                 if (! is_inside_bias_area())
-                   {
-                     if (mk_data(radio_altitude).get() < 245)
-                       return true;
-                   }
-               }
-           }
-       }
-      else
-       {
-         if (mk_data(radio_altitude).get() < 700)
-           return true;
-       }
-    }
+      // distance to the inner envelope edge
+      double edge_distance = distance - runway.half_length - k;
 
+      if (edge_distance > 15)
+      {
+        if (mk_data(radio_altitude).get() < 700)
+          return true;
+      }
+      else if (edge_distance > 12)
+      {
+        if (mk_data(radio_altitude).get() < 100 * edge_distance - 800)
+          return true;
+      }
+      else if (edge_distance > 4)
+      {
+        if (mk_data(radio_altitude).get() < 400)
+          return true;
+      }
+      else if (edge_distance > 2.45)
+      {
+        if (mk_data(radio_altitude).get() < 100 * edge_distance)
+          return true;
+      }
+      else if ( is_inside_edge_triangle(&runway.edge) && (edge_distance > 0.01) )
+      {
+        if (mk_data(radio_altitude).get() < 100 * edge_distance)
+          return true;
+      }
+      else if (! is_inside_bias_area())
+      {
+        if (mk_data(radio_altitude).get() < 245)
+          return true;
+      }
+    }
+    else if (mk_data(radio_altitude).get() < 700)
+    {
+      return true;
+    }
+  }
   return false;
 }
 
@@ -4405,31 +4389,25 @@ bool
 MK_VIII::TCFHandler::is_rfcf ()
 {
   if (has_runway)
-    {
-
-      double distance = SGGeodesy::distanceNm( SGGeod::fromDeg(mk_data(gps_longitude).get(),
-                                                               mk_data(gps_latitude).get()),
-                                               runway.center);
+  {
+    double distance = SGGeodesy::distanceNm( SGGeod::fromDegFt(mk_data(gps_longitude).get(),
+                                                               mk_data(gps_latitude).get(),
+                                                               runway.elevation),
+                                             runway.center);
+    distance -= runway.half_length;
 
+    if (distance < 5.0)
+    {
       double krf = k + mk_data(gps_vertical_figure_of_merit).get() / 200;
-      distance = distance - runway.half_length - krf;
-
-      if (distance <= 5)
-       {
-         double altitude_above_field = mk_data(geometric_altitude).get() - runway.elevation;
+      distance -= krf;
+      double altitude_above_field = mk_data(geometric_altitude).get() - runway.elevation;
 
-         if (distance >= 1.5)
-           {
-             if (altitude_above_field < 300)
-               return true;
-           }
-         else if (distance >= 0)
-           {
-             if (altitude_above_field < 200 * distance)
-               return true;
-           }
-       }
+      if ( (distance > 1.5) && (altitude_above_field < 300.0) )
+        return true;
+      else if ( (distance > 0.0) && (altitude_above_field < 200 * distance) )
+        return true;
     }
+  }
 
   return false;
 }
index b3e9b6baaba7c02ab8e04c39edc761b531170fc2..62649eff7aaf263154410ae44003d228d7cee1f4 100644 (file)
@@ -1287,7 +1287,7 @@ private:
       double           elevation;      // elevation in feet
       double           half_length;    // runway half length, in nautical miles
       double            half_width_m;   // runway half width, in meters
-      RunwayEdge       edges[2];       // runway threshold and end
+      RunwayEdge       edge;           // runway threshold
       SGVec3d          bias_points[2]; // vertices of the bias area
     } runway;