diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index 1867b0c18..cf20462f0 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -97,9 +97,9 @@ void FGAIAircraft::unbind() { void FGAIAircraft::update(double dt) { + FGAIBase::update(dt); Run(dt); Transform(); - FGAIBase::update(dt); } void FGAIAircraft::SetPerformance(const PERF_STRUCT *ps) { @@ -118,15 +118,9 @@ void FGAIAircraft::Run(double dt) { double turn_circum_ft; double speed_north_deg_sec; double speed_east_deg_sec; - double ft_per_deg_lon; - double ft_per_deg_lat; double dist_covered_ft; double alpha; - // get size of a degree at this latitude - ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()/SG_RADIANS_TO_DEGREES); - ft_per_deg_lon = 365228.16 * cos(pos.lat() / SG_RADIANS_TO_DEGREES); - // adjust speed double speed_diff = tgt_speed - speed; if (fabs(speed_diff) > 0.2) { @@ -237,85 +231,7 @@ void FGAIAircraft::Run(double dt) { //###########################// // do calculations for radar // //###########################// - double radar_range_ft2 = fgGetDouble("/instrumentation/radar/range"); - radar_range_ft2 *= SG_NM_TO_METER * SG_METER_TO_FEET; - radar_range_ft2 *= radar_range_ft2; - - double user_latitude = manager->get_user_latitude(); - double user_longitude = manager->get_user_longitude(); - double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat; - double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon; - double range_ft2 = lat_range*lat_range + lon_range*lon_range; - - // - // Test whether the target is within radar range. - // - in_range = (range_ft2 <= radar_range_ft2); - if ( in_range ) - { - props->setBoolValue("radar/in-range", true); - - // copy values from the AIManager - double user_altitude = manager->get_user_altitude(); - double user_heading = manager->get_user_heading(); - double user_pitch = manager->get_user_pitch(); - double user_yaw = manager->get_user_yaw(); - double user_speed = manager->get_user_speed(); - - // calculate range to target in feet and nautical miles - double range_ft = sqrt( range_ft2 ); - range = range_ft / 6076.11549; - - // calculate bearing to target - if (pos.lat() >= user_latitude) { - bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES; - if (pos.lon() >= user_longitude) { - bearing = 90.0 - bearing; - } else { - bearing = 270.0 + bearing; - } - } else { - bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES; - if (pos.lon() >= user_longitude) { - bearing = 180.0 - bearing; - } else { - bearing = 180.0 + bearing; - } - } - - // calculate look left/right to target, without yaw correction - horiz_offset = bearing - user_heading; - if (horiz_offset > 180.0) horiz_offset -= 360.0; - if (horiz_offset < -180.0) horiz_offset += 360.0; - - // calculate elevation to target - elevation = atan2( altitude_ft - user_altitude, range_ft ) - * SG_RADIANS_TO_DEGREES; - - // calculate look up/down to target - vert_offset = elevation + user_pitch; - -/* this calculation needs to be fixed, but it isn't important anyway - // calculate range rate - double recip_bearing = bearing + 180.0; - if (recip_bearing > 360.0) recip_bearing -= 360.0; - double my_horiz_offset = recip_bearing - hdg; - if (my_horiz_offset > 180.0) my_horiz_offset -= 360.0; - if (my_horiz_offset < -180.0) my_horiz_offset += 360.0; - rdot = (-user_speed * cos( horiz_offset * SG_DEGREES_TO_RADIANS )) - +(-speed * 1.686 * cos( my_horiz_offset * SG_DEGREES_TO_RADIANS )); -*/ - - // now correct look left/right for yaw - horiz_offset += user_yaw; - - // calculate values for radar display - y_shift = range * cos( horiz_offset * SG_DEGREES_TO_RADIANS); - x_shift = range * sin( horiz_offset * SG_DEGREES_TO_RADIANS); - rotation = hdg - user_heading; - if (rotation < 0.0) rotation += 360.0; - - } + double range_ft2 = UpdateRadar(manager); //************************************// // Tanker code // diff --git a/src/AIModel/AIBallistic.cxx b/src/AIModel/AIBallistic.cxx index c712a989b..fe53bb4d8 100644 --- a/src/AIModel/AIBallistic.cxx +++ b/src/AIModel/AIBallistic.cxx @@ -56,10 +56,9 @@ void FGAIBallistic::unbind() { } void FGAIBallistic::update(double dt) { - + FGAIBase::update(dt); Run(dt); Transform(); - FGAIBase::update(dt); } diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index 143cdd9dd..6b6b7f9e1 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -66,6 +66,8 @@ FGAIBase::~FGAIBase() { } void FGAIBase::update(double dt) { + ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()/SG_RADIANS_TO_DEGREES); + ft_per_deg_lon = 365228.16 * cos(pos.lat() / SG_RADIANS_TO_DEGREES); } @@ -182,6 +184,91 @@ void FGAIBase::unbind() { props->untie("controls/lighting/nav-lights"); } +double FGAIBase::UpdateRadar(FGAIManager* manager) +{ + double radar_range_ft2 = fgGetDouble("/instrumentation/radar/range"); + radar_range_ft2 *= SG_NM_TO_METER * SG_METER_TO_FEET * 1.1; // + 10% + radar_range_ft2 *= radar_range_ft2; + + double user_latitude = manager->get_user_latitude(); + double user_longitude = manager->get_user_longitude(); + double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat; + double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon; + double range_ft2 = lat_range*lat_range + lon_range*lon_range; + + // + // Test whether the target is within radar range. + // + in_range = (range_ft2 && (range_ft2 <= radar_range_ft2)); + if ( in_range ) + { + props->setBoolValue("radar/in-range", true); + + // copy values from the AIManager + double user_altitude = manager->get_user_altitude(); + double user_heading = manager->get_user_heading(); + double user_pitch = manager->get_user_pitch(); + double user_yaw = manager->get_user_yaw(); + double user_speed = manager->get_user_speed(); + + // calculate range to target in feet and nautical miles + double range_ft = sqrt( range_ft2 ); + range = range_ft / 6076.11549; + + // calculate bearing to target + if (pos.lat() >= user_latitude) { + bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES; + if (pos.lon() >= user_longitude) { + bearing = 90.0 - bearing; + } else { + bearing = 270.0 + bearing; + } + } else { + bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES; + if (pos.lon() >= user_longitude) { + bearing = 180.0 - bearing; + } else { + bearing = 180.0 + bearing; + } + } + + // calculate look left/right to target, without yaw correction + horiz_offset = bearing - user_heading; + if (horiz_offset > 180.0) horiz_offset -= 360.0; + if (horiz_offset < -180.0) horiz_offset += 360.0; + + // calculate elevation to target + elevation = atan2( altitude * SG_METER_TO_FEET - user_altitude, range_ft ) + * SG_RADIANS_TO_DEGREES; + + // calculate look up/down to target + vert_offset = elevation + user_pitch; + + /* this calculation needs to be fixed, but it isn't important anyway + // calculate range rate + double recip_bearing = bearing + 180.0; + if (recip_bearing > 360.0) recip_bearing -= 360.0; + double my_horiz_offset = recip_bearing - hdg; + if (my_horiz_offset > 180.0) my_horiz_offset -= 360.0; + if (my_horiz_offset < -180.0) my_horiz_offset += 360.0; + rdot = (-user_speed * cos( horiz_offset * SG_DEGREES_TO_RADIANS )) + +(-speed * 1.686 * cos( my_horiz_offset * SG_DEGREES_TO_RADIANS )); +*/ + + // now correct look left/right for yaw + horiz_offset += user_yaw; + + // calculate values for radar display + y_shift = range * cos( horiz_offset * SG_DEGREES_TO_RADIANS); + x_shift = range * sin( horiz_offset * SG_DEGREES_TO_RADIANS); + rotation = hdg - user_heading; + if (rotation < 0.0) rotation += 360.0; + + } + + return range_ft2; +} + /* * getters and Setters diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index f178f2dbf..9bb85fa24 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -76,6 +76,9 @@ protected: double altitude; // meters above sea level double vs; // vertical speed, feet per minute + double ft_per_deg_lon; + double ft_per_deg_lat; + // these describe the model's desired state double tgt_heading; // target heading, degrees true double tgt_altitude; // target altitude, *feet* above sea level @@ -109,6 +112,8 @@ protected: void Transform(); + double UpdateRadar(FGAIManager* manager); + string _type_str; object_type _otype; int index; @@ -182,5 +187,5 @@ inline int FGAIBase::getID() { return id; } inline FGAIBase::object_type FGAIBase::getType() { return _otype; } -#endif // _FG_AIBASE_HXX +#endif // _FG_AIBASE_HXX diff --git a/src/AIModel/AIShip.cxx b/src/AIModel/AIShip.cxx index 890ab0b49..c1c11d6cc 100644 --- a/src/AIModel/AIShip.cxx +++ b/src/AIModel/AIShip.cxx @@ -57,9 +57,9 @@ void FGAIShip::unbind() { void FGAIShip::update(double dt) { + FGAIBase::update(dt); Run(dt); Transform(); - FGAIBase::update(dt); } diff --git a/src/AIModel/AIStorm.cxx b/src/AIModel/AIStorm.cxx index 06c5d1b32..edba9038d 100644 --- a/src/AIModel/AIStorm.cxx +++ b/src/AIModel/AIStorm.cxx @@ -59,9 +59,9 @@ void FGAIStorm::unbind() { void FGAIStorm::update(double dt) { + FGAIBase::update(dt); Run(dt); Transform(); - FGAIBase::update(dt); } @@ -71,12 +71,6 @@ void FGAIStorm::Run(double dt) { double speed_north_deg_sec; double speed_east_deg_sec; - double ft_per_deg_lon; - double ft_per_deg_lat; - - // get size of a degree at this latitude - ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()/SG_RADIANS_TO_DEGREES); - ft_per_deg_lon = 365228.16 * cos(pos.lat() / SG_RADIANS_TO_DEGREES); // convert speed to degrees per second speed_north_deg_sec = cos( hdg / SG_RADIANS_TO_DEGREES ) @@ -88,64 +82,9 @@ void FGAIStorm::Run(double dt) { pos.setlat( pos.lat() + speed_north_deg_sec * dt); pos.setlon( pos.lon() + speed_east_deg_sec * dt); - double altitude_ft = altitude * SG_METER_TO_FEET; - //###########################// // do calculations for radar // //###########################// - - // copy values from the AIManager - double user_latitude = manager->get_user_latitude(); - double user_longitude = manager->get_user_longitude(); - double user_altitude = manager->get_user_altitude(); - double user_heading = manager->get_user_heading(); - double user_pitch = manager->get_user_pitch(); - double user_yaw = manager->get_user_yaw(); - // double user_speed = manager->get_user_speed(); - - // calculate range to target in feet and nautical miles - double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat; - double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon; - double range_ft = sqrt( lat_range*lat_range + lon_range*lon_range ); - range = range_ft / 6076.11549; - - // calculate bearing to target - if (pos.lat() >= user_latitude) { - bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES; - if (pos.lon() >= user_longitude) { - bearing = 90.0 - bearing; - } else { - bearing = 270.0 + bearing; - } - } else { - bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES; - if (pos.lon() >= user_longitude) { - bearing = 180.0 - bearing; - } else { - bearing = 180.0 + bearing; - } - } - - // calculate look left/right to target, without yaw correction - horiz_offset = bearing - user_heading; - if (horiz_offset > 180.0) horiz_offset -= 360.0; - if (horiz_offset < -180.0) horiz_offset += 360.0; - - // calculate elevation to target - elevation = atan2( altitude_ft - user_altitude, range_ft ) - * SG_RADIANS_TO_DEGREES; - - // calculate look up/down to target - vert_offset = elevation + user_pitch; - - // now correct look left/right for yaw - horiz_offset += user_yaw; - - // calculate values for radar display - y_shift = range * cos( horiz_offset * SG_DEGREES_TO_RADIANS); - x_shift = range * sin( horiz_offset * SG_DEGREES_TO_RADIANS); - rotation = hdg - user_heading; - if (rotation < 0.0) rotation += 360.0; - + UpdateRadar(manager); } diff --git a/src/AIModel/AIThermal.cxx b/src/AIModel/AIThermal.cxx index c94a6e22c..d6bc36a1a 100644 --- a/src/AIModel/AIThermal.cxx +++ b/src/AIModel/AIThermal.cxx @@ -63,9 +63,9 @@ void FGAIThermal::unbind() { void FGAIThermal::update(double dt) { + FGAIBase::update(dt); Run(dt); Transform(); - FGAIBase::update(dt); }