]> git.mxchange.org Git - flightgear.git/commitdiff
Fixed some problems with marker beacon range:
authorcurt <curt>
Mon, 19 Mar 2001 13:56:19 +0000 (13:56 +0000)
committercurt <curt>
Mon, 19 Mar 2001 13:56:19 +0000 (13:56 +0000)
a) I was compairing feet vs. meter (making the range 3x too. big)
b) I was using the diameter in place of the radius (making the range an
   additional 2x too big.)
c) Updated the equation for calculating range to model the weak transmitter
   not being picked up at upper altitudes.

We still might need some additional tweaking, but I think we are starting to
get in the right ball park.

src/GUI/gui_local.hxx
src/Main/main.cxx
src/Navaids/mkrbeacons.cxx

index 82698d95a7cf4656f68dc8ae01778cac78512042..6958f71183a466a4dd3b28930e3ca5ee301595f4 100644 (file)
@@ -1,3 +1,9 @@
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <simgear/compiler.h>
+
 #include "trackball.h"
 
 #if defined(WIN32) || defined(__CYGWIN32__)
index bab4f7e917dfcbde26c7ec3da87a01d27c39e8b1..d669b9072b67a97de5b4f40d99084ca9b02af574 100644 (file)
@@ -30,8 +30,8 @@
 #endif
 
 #ifdef HAVE_WINDOWS_H
-#  include <windows.h>                     
-#  include <float.h>                    
+#  include <windows.h>
+#  include <float.h>
 #endif
 
 #include <GL/glut.h>
index a3e8d33ed5f7bc947fdfb266649f5628989d5a88..6c4da70ed323b032ba4b4bc40b955c8a03007c3f 100644 (file)
@@ -172,7 +172,7 @@ FGBeacon::fgMkrBeacType FGMarkerBeacons::query( double lon, double lat,
        // cout << "    aircraft = " << aircraft << " station = " << station 
        //      << endl;
 
-       double d = aircraft.distance3Dsquared( station );
+       double d = aircraft.distance3Dsquared( station ); // meters^2
        // cout << "  distance = " << d << " (" 
        //      << FG_ILS_DEFAULT_RANGE * NM_TO_METER 
        //         * FG_ILS_DEFAULT_RANGE * NM_TO_METER
@@ -187,20 +187,31 @@ FGBeacon::fgMkrBeacType FGMarkerBeacons::query( double lon, double lat,
        // cout << "elev = " << elev * METER_TO_FEET
        //      << " current->get_elev() = " << current->get_elev() << endl;
        double delev = elev * METER_TO_FEET - current->get_elev();
-       double maxrange = 4200 * delev / 1000;
+
+       // max range is the area under r = 2.4 * alt or r^2 = 4000^2 - alt^2
+       // whichever is smaller.  The intersection point is 1538 ...
+       double maxrange2;       // feet^2
+       if ( delev < 1538.0 ) {
+           maxrange2 = 2.4 * 2.4 * delev * delev;
+       } else if ( delev < 4000.0 ) {
+           maxrange2 = 4000 * 4000 - delev * delev;
+       } else {
+           maxrange2 = 0.0;
+       }
+       maxrange2 *= FEET_TO_METER * FEET_TO_METER; // convert to meter^2
        // cout << "delev = " << delev << " maxrange = " << maxrange << endl;
 
        // match up to twice the published range so we can model
        // reduced signal strength
-       if ( d < maxrange * maxrange ) {
-           // cout << "lon = " << lon << " lat = " << lat
-           //      << "  closest beacon = " << sqrt( min_dist ) << endl;
+       if ( d < maxrange2 ) {
+           cout << "lon = " << lon << " lat = " << lat
+                << "  closest beacon = " << sqrt( min_dist ) << endl;
            return current->get_type();
        }
     }
 
-    // cout << "lon = " << lon << " lat = " << lat
-    //      << "  closest beacon = " << sqrt( min_dist ) << endl;
+    cout << "lon = " << lon << " lat = " << lat
+         << "  closest beacon = " << sqrt( min_dist ) << endl;
 
     return FGBeacon::NOBEACON;
 }