예제 #1
0
        /// <summary>
        /// Currently this only calculates the change in velocity from 0 to planet radius +* 0.33333.
        /// TODO: add gravity drag and atmosphere drag, and tech improvements for such.
        /// </summary>
        /// <param name="planetEntity"></param>
        /// <param name="payload"></param>
        /// <returns></returns>
        public static double FuelCostToLowOrbit(Entity planetEntity, double payload)
        {
            var lowOrbit = LowOrbitRadius(planetEntity);

            var     exaustVelocity = 275;
            var     sgp            = OrbitMath.CalculateStandardGravityParameter(payload, planetEntity.GetDataBlob <MassVolumeDB>().Mass);
            Vector3 pos            = new Vector3(lowOrbit, 0, 0);

            var vel      = OrbitMath.ObjectLocalVelocityPolar(sgp, pos, lowOrbit, 0, 0, 0);
            var fuelCost = OrbitMath.TsiolkovskyFuelCost(payload, exaustVelocity, vel.speed);

            return(fuelCost);
        }
예제 #2
0
        /// <summary>
        /// PreciseOrbital Velocy in polar coordinates
        ///
        /// </summary>
        /// <returns>item1 is speed, item2 angle</returns>
        /// <param name="orbit">Orbit.</param>
        /// <param name="atDateTime">At date time.</param>
        public static (double speed, double heading) InstantaneousOrbitalVelocityPolarCoordinate(OrbitDB orbit, DateTime atDateTime)
        {
            var position = GetPosition_AU(orbit, atDateTime);
            var sma      = orbit.SemiMajorAxis_AU;

            if (orbit.GravitationalParameter_Km3S2 == 0 || sma == 0)
            {
                return(0, 0); //so we're not returning NaN;
            }
            var sgp = orbit.GravitationalParameterAU;

            double e           = orbit.Eccentricity;
            double trueAnomaly = GetTrueAnomaly(orbit, atDateTime);
            double aoP         = orbit.ArgumentOfPeriapsis;

            (double speed, double heading)polar = OrbitMath.ObjectLocalVelocityPolar(sgp, position, sma, e, trueAnomaly, aoP);

            return(polar);
        }