private void CalculateExtendedParameters() { if (IsStationary) { return; } // Calculate extended parameters. // http://en.wikipedia.org/wiki/Standard_gravitational_parameter#Two_bodies_orbiting_each_other GravitationalParameter_Km3S2 = GMath.GravitationalParameter_Km3s2(_parentMass + _myMass); // Normalize GravitationalParameter from m^3/s^2 to km^3/s^2 GravitationalParameterAU = GMath.GrabitiationalParameter_Au3s2(_parentMass + _myMass); // (149597870700 * 149597870700 * 149597870700); GravitationalParameter_m3S2 = GMath.StandardGravitationalParameter(_parentMass + _myMass); double orbitalPeriod = 2 * Math.PI * Math.Sqrt(Math.Pow(Distance.AuToKm(SemiMajorAxis_AU), 3) / (GravitationalParameter_Km3S2)); if (orbitalPeriod * 10000000 > long.MaxValue) { OrbitalPeriod = TimeSpan.MaxValue; } else { OrbitalPeriod = TimeSpan.FromSeconds(orbitalPeriod); } // http://en.wikipedia.org/wiki/Mean_motion MeanMotion_DegreesSec = Math.Sqrt(GravitationalParameter_Km3S2 / Math.Pow(Distance.AuToKm(SemiMajorAxis_AU), 3)); // Calculated in radians. MeanMotion_DegreesSec = Angle.ToDegrees(MeanMotion_DegreesSec); // Stored in degrees. Apoapsis_AU = (1 + Eccentricity) * SemiMajorAxis_AU; Periapsis_AU = (1 - Eccentricity) * SemiMajorAxis_AU; SOI_m = OrbitMath.GetSOI(SemiMajorAxis, _myMass, _parentMass); }
/// <summary> /// Gets the SOI radius of a given body. /// </summary> /// <returns>The SOI radius in AU</returns> /// <param name="entity">Entity which has OrbitDB and MassVolumeDB</param> public static double GetSOI(Entity entity) { var orbitDB = entity.GetDataBlob <OrbitDB>(); if (orbitDB.Parent != null) //if we're not the parent star { var semiMajAxis = orbitDB.SemiMajorAxis; var myMass = entity.GetDataBlob <MassVolumeDB>().Mass; var parentMass = orbitDB.Parent.GetDataBlob <MassVolumeDB>().Mass; return(OrbitMath.GetSOI(semiMajAxis, myMass, parentMass)); } else { return(double.MaxValue); //if we're the parent star, then soi is infinate. } }