]> git.mxchange.org Git - flightgear.git/commitdiff
Move the radar update code to the AIBase class. There seems to be a problem where...
authorehofman <ehofman>
Fri, 11 Jun 2004 13:49:07 +0000 (13:49 +0000)
committerehofman <ehofman>
Fri, 11 Jun 2004 13:49:07 +0000 (13:49 +0000)
src/AIModel/AIAircraft.cxx
src/AIModel/AIBallistic.cxx
src/AIModel/AIBase.cxx
src/AIModel/AIBase.hxx
src/AIModel/AIShip.cxx
src/AIModel/AIStorm.cxx
src/AIModel/AIThermal.cxx

index 1867b0c18d12841c3eabfea41275fe0dd368d906..cf20462f00118cdb4d9c6d07ac285a07b3e158a3 100644 (file)
@@ -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                        //
index c712a989b70f2a074b40eaf9f8c4d69b25547573..fe53bb4d87c237f253bca16eee37d903eca3fc37 100644 (file)
@@ -56,10 +56,9 @@ void FGAIBallistic::unbind() {
 }
 
 void FGAIBallistic::update(double dt) {
-
+   FGAIBase::update(dt);
    Run(dt);
    Transform();
-   FGAIBase::update(dt);
 }
 
 
index 143cdd9ddcc412b73827ba33bd9a1ab8da92a28e..6b6b7f9e10184d00b1c4ec044f68ca7ccb20ab9a 100644 (file)
@@ -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
index f178f2dbf10a5a6f1a53df29d2eddcd81d35f638..9bb85fa24aa2c7bd5646f2875005cdcd0a94e2e1 100644 (file)
@@ -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
 
index 890ab0b49e5705d837a7c382015f27e2f1dc4259..c1c11d6cc46eec679bd0b344e2d0f77057aa5edb 100644 (file)
@@ -57,9 +57,9 @@ void FGAIShip::unbind() {
 
 void FGAIShip::update(double dt) {
 
+   FGAIBase::update(dt);
    Run(dt);
    Transform();
-   FGAIBase::update(dt);
 }
 
 
index 06c5d1b3201623b7e0c056c27cc3a0a29139d145..edba9038dc7720b24d4ea6e2a6cde15bf246de97 100644 (file)
@@ -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);
 }
 
index c94a6e22cc1ef2606e4bf9f6d7fbe1154bb42d14..d6bc36a1afc1f891dbf5c5b642a5b35038a43796 100644 (file)
@@ -63,9 +63,9 @@ void FGAIThermal::unbind() {
 
 
 void FGAIThermal::update(double dt) {
+   FGAIBase::update(dt);
    Run(dt);
    Transform();
-   FGAIBase::update(dt);
 }