Advertisement
Whiplash141

Whip's Quadratic Missile Intercept [OLD]

Sep 21st, 2017
481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.13 KB | None | 0 0
  1. //Whip's Quadratic Missile Intercept Code
  2. Vector3D CalculateMissileIntercept(double missileSpeed, Vector3D missilePosition, Vector3D targetVelocityVec, Vector3D targetPos)
  3. {
  4.     Vector3D directHeadingVec = targetPos - missilePosition;
  5.  
  6.     var targetSpeed = targetVelocityVec.Length();
  7.  
  8.     if (targetSpeed == 0 || missileSpeed == 0)
  9.     {
  10.         return directHeadingVec;
  11.     }
  12.  
  13.     //Using law of cosines we assume that all the missile's velocity is in the direction of intercept
  14.     double A = targetSpeed * targetSpeed - missileSpeed * missileSpeed;
  15.     double B = 2 * targetVelocityVec.Dot(directHeadingVec);
  16.     double C = directHeadingVec.LengthSquared();
  17.     double D = B * B - 4 * A * C;
  18.  
  19.     double tf = 0;
  20.     if (A == 0) //check for linear case: t = C / -B
  21.     {
  22.         if (B == 0)
  23.         {
  24.             return directHeadingVec;
  25.         }
  26.         else
  27.         {
  28.             tf = C / -B;
  29.             //debugMe += "Linear: " + Math.Round(tf).ToString();
  30.             if (tf <= 0)
  31.             {
  32.                 //return targetVelocityVec;
  33.                 return directHeadingVec;
  34.             }
  35.         }
  36.     }
  37.     else if (D >= 0) //ensures real answer for quadratic formula
  38.     {
  39.         double t1 = (-B + Math.Sqrt(D)) / (2 * A);
  40.         double t2 = (-B - Math.Sqrt(D)) / (2 * A);
  41.  
  42.         if (t1 < 0 && t2 >= 0)
  43.         {
  44.             tf = t2;
  45.         }
  46.         else if (t1 >= 0 && t2 < 0)
  47.         {
  48.             tf = t1;
  49.         }
  50.         else if (t1 < 0 && t2 < 0)
  51.         {
  52.             return directHeadingVec; //travel direct
  53.         }
  54.         else if (t1 >= 0 && t2 >= 0)
  55.         {
  56.             if (t1 > t2)
  57.             {
  58.                 tf = t2; //we want shortest one
  59.             }
  60.             else
  61.             {
  62.                 tf = t1;
  63.             }
  64.         }
  65.         else
  66.         {
  67.             //debugMe = "None of the above";
  68.             return directHeadingVec; //travel direct
  69.         }
  70.     }
  71.     else
  72.     { //non real answer
  73.         return directHeadingVec;
  74.     }
  75.  
  76.     Vector3D adjustedVecTargetVel = targetVelocityVec * tf + directHeadingVec;
  77.     return adjustedVecTargetVel;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement