+static bool check_beacon_range( double lon_rad, double lat_rad, double elev_m,
+ FGNavRecord *b )
+{
+ Point3D aircraft = sgGeodToCart( Point3D(lon_rad, lat_rad, elev_m) );
+ Point3D station = Point3D( b->get_x(), b->get_y(), b->get_z() );
+ // cout << " aircraft = " << aircraft << " station = " << station
+ // << endl;
+
+ double d = aircraft.distance3Dsquared( station ); // meters^2
+ // cout << " distance = " << d << " ("
+ // << FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER
+ // * FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER
+ // << ")" << endl;
+
+ // cout << " range = " << sqrt(d) << endl;
+
+ // cout << "elev = " << elev * SG_METER_TO_FEET
+ // << " current->get_elev() = " << current->get_elev() << endl;
+ double elev_ft = elev_m * SG_METER_TO_FEET;
+ double delev = elev_ft - b->get_elev_ft();
+
+ // 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 *= SG_FEET_TO_METER * SG_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 < maxrange2 ) {
+ return true;
+ } else {
+ return false;
+ }
+}
+