Advertisement
Guest User

Untitled

a guest
May 12th, 2022
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.82 KB | None | 0 0
  1. public TestOrbit(
  2.         Vector3 _attractorPosition,
  3.         Vector3 _satellitePosition,
  4.         Vector3 _attractorVelocity,
  5.         Vector3 _satelliteVelocity,
  6.         float _attractorMass,
  7.         float _gConstant)
  8.     {
  9.         attractorPosition = _attractorPosition;
  10.         satellitePosition = _satellitePosition;
  11.         attractorVelocity = _attractorVelocity;
  12.         satelliteVelocity = _satelliteVelocity;
  13.         attractorMass = _attractorMass;
  14.         gConstant = _gConstant;
  15.  
  16.         /*###################################################
  17.  
  18.         All code past this point must be verified to be true or all tests are useless.
  19.  
  20.         Guide for test code verification:
  21.         [Best]      //! This is established to be the most accurate method avaliable from a first hand source who is knowledgable on the subject (If you believe you qualify let us know. A username is required, no reference).
  22.         [Good]      //* This is true and accurate based on second hand knowledge (Reference or reasoning must be provided, if your reference is wikipedia, random forum user or similar use //? instead).
  23.         [ok]        //? This is most likely true and accurate(reference or reasoning required).
  24.         [unusable]  //Todo: This is straight up not implemented properly and should not be used for testing purposes but is temporary.
  25.  
  26.         ###################################################*/
  27.  
  28.         relativePosition = satellitePosition - attractorPosition;
  29.         relativeVelocity = satelliteVelocity - attractorVelocity;
  30.         distance = relativePosition.magnitude;
  31.         speed = relativeVelocity.magnitude;
  32.  
  33.         standardGravitationalParameter = attractorMass * gConstant;
  34.  
  35.         angularMomentumVector = Vector3.Cross(relativePosition, relativeVelocity);
  36.         angularMomentum = angularMomentumVector.magnitude;
  37.  
  38.         inclination = Acos(angularMomentumVector.z/ angularMomentum);
  39.  
  40.         eccentricityVector = Vector3.Cross(relativeVelocity, angularMomentumVector) / standardGravitationalParameter - relativePosition.normalized;
  41.         eccentricity = eccentricityVector.magnitude;
  42.  
  43.         accendingNodeVector = Vector3.Cross(new Vector3(0, 0, 1), angularMomentumVector);
  44.         RAAN = Acos(accendingNodeVector.x / accendingNodeVector.magnitude);
  45.  
  46.         if(accendingNodeVector.y < 0)
  47.             RAAN = 2 * PI - RAAN;
  48.  
  49.         argumentOfPeriapsis = Acos( Vector3.Dot(eccentricityVector, accendingNodeVector) / (eccentricity * accendingNodeVector.magnitude) );
  50.  
  51.         if(eccentricityVector.z < 0)
  52.             argumentOfPeriapsis = 2 * PI - argumentOfPeriapsis;  
  53.  
  54.         trueAnomaly = Acos( Vector3.Dot(eccentricityVector, relativePosition) / (eccentricity * distance) );
  55.  
  56.         if (Vector3.Dot(relativePosition, relativeVelocity) < 0)
  57.             trueAnomaly = 2 * PI - trueAnomaly;
  58.  
  59.         acceleration = relativePosition.normalized * attractorMass * gConstant / relativePosition.sqrMagnitude;
  60.  
  61.         escapeSpeed = Sqrt((standardGravitationalParameter * 2) / distance);
  62.         circleSpeed = Sqrt(standardGravitationalParameter / distance);
  63.  
  64.         perifocalFrame = angularMomentumVector.normalized;
  65.  
  66.         specificKineticEnergy = Pow(speed, 2) / 2;
  67.         specificGravitationalPotentialEnergy = - standardGravitationalParameter / distance;
  68.  
  69.         switch (eccentricity)
  70.         {
  71.             case 0:
  72.                 Assert.AreApproximatelyEqual(speed, circleSpeed);
  73.  
  74.                 meanAnomaly = trueAnomaly;
  75.                 eccentricAnomaly = trueAnomaly;
  76.  
  77.                 semiMajorAxis = distance;
  78.                 semiMinorAxis = distance;
  79.                 periapsis = distance;
  80.                 apoapsis = distance;
  81.                 semiLatusRectum = distance;
  82.  
  83.                 specificOrbitalEnergy = - standardGravitationalParameter / (2 * distance);
  84.                 areaOfOrbit = 2 * PI * distance;
  85.                 orbitalPeriod = (2 * areaOfOrbit) / angularMomentum;
  86.                 timeSincePerapsis = meanAnomaly / (2 * PI) * orbitalPeriod;
  87.  
  88.                 flightPathAngle = PI / 2;
  89.                 turnAngle = PI;
  90.                 break;
  91.  
  92.             case var _ when eccentricity < 1:
  93.                 eccentricAnomaly = 2 * Atan( Sqrt( (1 - eccentricity) / (1 + eccentricity) ) * Tan(trueAnomaly/2) );
  94.                 meanAnomaly = eccentricAnomaly - eccentricity * Sin(eccentricAnomaly);
  95.  
  96.                 semiMajorAxis = Pow(angularMomentum, 2) / standardGravitationalParameter * (1 / (1 - Pow(eccentricity, 2) ) );
  97.                 semiMinorAxis = semiMajorAxis * (1 - Pow(eccentricity, 2));
  98.                 semiLatusRectum = semiMajorAxis * (1 - Pow(eccentricity, 2));
  99.                 periapsis = semiMajorAxis * ( 1 - eccentricity );
  100.                 apoapsis = semiMajorAxis * ( 1 + eccentricity );
  101.                
  102.                 specificOrbitalEnergy = - standardGravitationalParameter / (2 * semiMajorAxis);
  103.                 areaOfOrbit = PI * semiMajorAxis * semiMinorAxis;
  104.                 orbitalPeriod = (2 * areaOfOrbit) / angularMomentum;
  105.                 timeSincePerapsis = meanAnomaly / (2 * PI) * orbitalPeriod;
  106.  
  107.                 flightPathAngle = Atan( (eccentricity * Sin(trueAnomaly)) / (1 + eccentricity * Sin(trueAnomaly)));
  108.                 turnAngle = PI;
  109.                 break;
  110.  
  111.             case 1:
  112.                 eccentricAnomaly = Tan(trueAnomaly/2);
  113.                 meanAnomaly = eccentricAnomaly + Pow(eccentricAnomaly, 3)/3;
  114.  
  115.                 semiLatusRectum = Pow(angularMomentum, 2) / standardGravitationalParameter;
  116.                 semiMinorAxis = float.PositiveInfinity; //? not sure on this one https://math.stackexchange.com/questions/3366659/semi-minor-axis-of-a-parabola
  117.                 semiMajorAxis = float.PositiveInfinity;
  118.                 periapsis = semiLatusRectum / 2;
  119.                 apoapsis = float.PositiveInfinity;
  120.  
  121.                 specificOrbitalEnergy = 0f;
  122.                 Assert.AreEqual(specificOrbitalEnergy, (Pow(speed,2)/2) - (standardGravitationalParameter/distance));
  123.                 areaOfOrbit = float.PositiveInfinity;
  124.                 orbitalPeriod = float.PositiveInfinity;
  125.                 timeSincePerapsis = meanAnomaly / (Pow(standardGravitationalParameter, 2) / Pow(angularMomentum, 3));
  126.  
  127.  
  128.                 flightPathAngle = trueAnomaly / 2;
  129.                 turnAngle = PI - Epsilon;
  130.                 break;
  131.  
  132.             default:
  133.                 eccentricAnomaly = 2 * Atanh( Sqrt( (eccentricity - 1) / (eccentricity + 1) ) * Tan(trueAnomaly/2) );
  134.                 meanAnomaly = eccentricity * Sinh(eccentricAnomaly) - eccentricAnomaly;
  135.  
  136.                 apoapsis = Pow(angularMomentum, 2)/standardGravitationalParameter * (1 / (1 - eccentricity));
  137.                 periapsis = Pow(angularMomentum, 2)/standardGravitationalParameter * (1 / (1 + eccentricity));
  138.                 semiMajorAxis = 1 / (2 / distance - Pow(speed, 2)/standardGravitationalParameter);
  139.                 semiMinorAxis = - semiMajorAxis * Sqrt(Pow(eccentricity, 2) - 1);
  140.                 semiLatusRectum = semiMajorAxis * (Pow(eccentricity, 2) - 1);
  141.  
  142.                 specificOrbitalEnergy = - standardGravitationalParameter / (2 * semiMajorAxis);
  143.                 areaOfOrbit = float.PositiveInfinity;
  144.                 orbitalPeriod = float.PositiveInfinity;
  145.                 timeSincePerapsis = Sqrt(Pow(-semiMajorAxis, 3) / standardGravitationalParameter) * meanAnomaly;
  146.  
  147.                 turnAngle = 2 * Asin(1 / eccentricity);
  148.                 flightPathAngle = Atan( (eccentricity * Sin(trueAnomaly)) / (1 + eccentricity * Cos(trueAnomaly)));
  149.                 break;
  150.         }
  151.  
  152.         Assert.AreApproximatelyEqual(specificOrbitalEnergy, specificGravitationalPotentialEnergy + specificKineticEnergy, $"Gravitational potential energy ({specificGravitationalPotentialEnergy}) + kinetic energy ({specificKineticEnergy}) should equal orbital energy.");
  153.  
  154.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement