Advertisement
KeithS

Interception.cpp

Jul 21st, 2012
528
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.43 KB | None | 0 0
  1. #include <cstdio>
  2. #include <math.h>
  3. #include <unistd.h>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #define _USE_MATH_DEFINES
  7. #define RAD_TO_DEG(x) (x)*(180.0/M_PI)
  8. #define DEG_TO_RAD(x) (x)*(M_PI/180.0)
  9.  
  10. struct aircraft
  11. {
  12.     float x_pos;
  13.     float y_pos;
  14.     float spd;
  15.     float hdg;
  16. };
  17.  
  18. int main()
  19. {
  20.     aircraft bomber;
  21.     aircraft fighter;
  22.  
  23.     srand(time(NULL));
  24.  
  25.     bomber.spd = 20.0f;
  26.     bomber.x_pos = float((rand() % 1000) - 500); // 200.0f;
  27.     bomber.y_pos = float((rand() % 1000) - 500); // 350.0f;
  28.     bomber.hdg = 6.00f;
  29.     fighter.spd = 25.5f;
  30.     fighter.x_pos = float((rand() % 1000) - 500); // 0.0f;
  31.     fighter.y_pos = float((rand() % 1000) - 500); // 0.0f;
  32.  
  33.     printf("\nBomber X: %.1f\n", bomber.x_pos);
  34.     printf("Bomber Y: %.1f\n", bomber.y_pos);
  35.     printf("Bomber Hdg: %.2f\n", bomber.hdg);
  36.     printf("Fighter X: %.1f\n", fighter.x_pos);
  37.     printf("Fighter Y: %.1f\n\n", fighter.y_pos);
  38.     float x_dist = fighter.x_pos - bomber.x_pos;
  39.     float y_dist = fighter.y_pos - bomber.y_pos;
  40.     float tot_dist = hypotf(y_dist, x_dist);
  41.     printf("Total Distance: %.2f\n\n", tot_dist);
  42.  
  43.     float bmb2fgt_brg = atan2f(y_dist, x_dist);
  44.     printf("Bearing bmb to fgt: %.2f\n", bmb2fgt_brg);
  45.     float fgt2bmb_brg = atan2f(-y_dist, -x_dist);
  46.     printf("Bearing fgt to bmb: %.2f\n\n", fgt2bmb_brg);
  47.  
  48.     // Correct to full rads. It helps.
  49.     if(bmb2fgt_brg < 0.0f)
  50.         bmb2fgt_brg += (M_PI * 2.0f);
  51.     if(fgt2bmb_brg < 0.0f)
  52.         fgt2bmb_brg += (M_PI * 2.0f);
  53.  
  54.     printf("Bearing bmb to fgt (corrected): %.2f\n", bmb2fgt_brg);
  55.     printf("Bearing fgt to bmb (corrected): %.2f\n\n", fgt2bmb_brg);
  56.  
  57.     // Relative bearing (angle on bow) bearing - heading;
  58.     float bmb_ang_bow = bmb2fgt_brg - bomber.hdg;
  59.     // Correct so that relative bearings are 0.0 to -3.14159 (left) or 0.0 to 3.14159 (right).
  60.     if(bmb_ang_bow < -M_PI)
  61.         bmb_ang_bow += (M_PI * 2);
  62.     if(bmb_ang_bow > M_PI)
  63.         bmb_ang_bow -= (M_PI * 2);
  64.  
  65.     printf("bmb to fgt angle on bow: %.2f\n\n", bmb_ang_bow);
  66.  
  67.     // Get the angle to intercept for the fighter.
  68.     float sine_angle = (bomber.spd * sinf(bmb_ang_bow)) / fighter.spd;
  69.     printf("Sine of angle to intercept: %.2f\n\n", sine_angle);
  70.     float inter_angle = asinf(sine_angle);
  71.     printf("Angle to intercept (radians): %.2f\n", inter_angle);
  72.     printf("Angle to intercept (degrees): %.2f\n\n", RAD_TO_DEG(inter_angle));
  73.  
  74.     float inter_hdg = fgt2bmb_brg + inter_angle;
  75.     if(inter_hdg > (M_PI * 2))
  76.         inter_hdg -= (M_PI * 2);
  77.     if(inter_hdg < 0.0f)
  78.         inter_hdg += (M_PI * 2);
  79.  
  80.     printf("Heading to intercept (radians): %.2f\n", inter_hdg);
  81.     printf("Heading to intercept (degrees): %.2f\n\n", RAD_TO_DEG(inter_hdg));
  82.  
  83.     fighter.hdg = inter_hdg;
  84.  
  85.     // Get the convergence angle. We will need this to calculate distance to intercept.
  86.     // We will need the intercept angle and the angle on bow. As this is a pure Sine Rule
  87.     // problem, do not accept any negative values, if only for convenience. You are going to
  88.     // need to compute the remaining (convergence) angle.
  89.     float int_angle_mod = inter_angle;
  90.     float bmb_ang_bow_mod = bmb_ang_bow;
  91.     if(int_angle_mod < 0.0f)
  92.         int_angle_mod *= -1.0f;
  93.     if(bmb_ang_bow_mod < 0.0f)
  94.         bmb_ang_bow_mod *= -1.0f;
  95.  
  96.     float converge_angle = M_PI - (int_angle_mod + bmb_ang_bow_mod);
  97.  
  98.     // A bit extra here. Calculate the range at which the interception is going to happen,
  99.     // using the Sine Rule.
  100.     float inter_range = (tot_dist / sinf(converge_angle)) * sinf(bmb_ang_bow_mod);
  101.     bool proceed = false;
  102.     if(inter_range > 0.0f)
  103.     {
  104.         printf("Distance to intercept %.2f\n\n", inter_range);
  105.         proceed = true;
  106.     }
  107.     if(inter_range < 0.0f)
  108.         printf("Intercept not possible.\n\n");
  109.  
  110.     usleep(3000000);
  111.     while(proceed == true)
  112.     {
  113.         usleep(75000);
  114.         bomber.x_pos += cosf(bomber.hdg) * bomber.spd;
  115.         bomber.y_pos += sinf(bomber.hdg) * bomber.spd;
  116.         fighter.x_pos += cosf(fighter.hdg) * fighter.spd;
  117.         fighter.y_pos += sinf(fighter.hdg) * fighter.spd;
  118.         x_dist = fighter.x_pos - bomber.x_pos;
  119.         y_dist = fighter.y_pos - bomber.y_pos;
  120.         tot_dist = hypotf(y_dist, x_dist);
  121.         printf("Closure distance: %.1f\n", tot_dist);
  122.         if(tot_dist < 25.0f)
  123.         {
  124.             printf("\nINTERCEPTED!\n\n");
  125.             proceed = false;
  126.         }
  127.     }
  128.  
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement