예제 #1
0
    public OrbitalElements ToOrbitalElements(Quantity mu)
    {
        var eccA   = (velocity.SqrMagitude - (mu / position.Magnitude).Magnitude) * position;
        var eccB   = Quantity3.Dot(position, velocity) * velocity;
        var eccVec = (eccA - eccB) / mu;

        var oe = new OrbitalElements();

        oe.Eccentricity = eccVec.Magnitude.DoubleValue;

        var specMechEnergy = (velocity.SqrMagitude / 2) - (mu / position.Magnitude);

        oe.SemiMajorAxis = -1 * (mu / (2 * specMechEnergy.Magnitude));

        Quantity3 angularMomentum = Quantity3.Cross(position, velocity);

        oe.Inclination = Math.Acos((angularMomentum.Y / angularMomentum.Magnitude).DoubleValue);

        Quantity3 nodeVector = Quantity3.Cross(new Quantity3(SciNumber.One, SciNumber.Zero, SciNumber.Zero), angularMomentum);

        oe.LongitudeOfAscendingNode = Math.Acos((nodeVector.X / nodeVector.Magnitude).DoubleValue);

        oe.ArgumentOfPeriapsis = Math.Acos((Quantity3.Dot(nodeVector, eccVec) / (nodeVector.Magnitude * eccVec.Magnitude)).DoubleValue);

        oe.TrueAnomoly = Math.Acos((Quantity3.Dot(eccVec, position) / (eccVec.Magnitude * position.Magnitude)).DoubleValue);

        return(oe);
    }
예제 #2
0
        public virtual string getDefaultUnit(string unitPreference)
        {
            string selUnit = Unit1;

            if (defaultQuantity == null || defaultQuantity == 0)
            {
                selUnit = Unit1;
                if (Quantity2 != null && !Quantity2.Equals(BigDecimalMath.ZERO))
                {
                    selUnit = Unit2;
                }
                if (Quantity3 != null && !Quantity3.Equals(BigDecimalMath.ZERO))
                {
                    selUnit = Unit3;
                }
                if (QuantityF != null && !QuantityF.Equals(BigDecimalMath.ZERO))
                {
                    selUnit = UnitF;
                }
            }
            else if (defaultQuantity.Value == 1)
            {
                selUnit = Unit1;
            }
            else if (defaultQuantity.Value == 2)
            {
                selUnit = Unit2;
            }
            else if (defaultQuantity.Value == 3)
            {
                selUnit = Unit3;
            }
            else if (defaultQuantity.Value == 4)
            {
                selUnit = UnitF;
            }

            if (!selUnit.Equals(unitPreference))
            {
                if (Quantity1 != null && unitPreference.Equals(Unit1))
                {
                    selUnit = Unit1;
                }
                if (Quantity2 != null && unitPreference.Equals(Unit2))
                {
                    selUnit = Unit2;
                }
                if (Quantity3 != null && unitPreference.Equals(Unit3))
                {
                    selUnit = Unit3;
                }
                if (QuantityF != null && unitPreference.Equals(UnitF))
                {
                    selUnit = UnitF;
                }
                //System.out.println("AFTER COMPARING: "+selUnit+ " and "+ut);
            }

            return(selUnit);
        }
예제 #3
0
 public static Quantity3 Cross(Quantity3 a, Quantity3 b)
 {
     return(new Quantity3(new List <SciNumber>()
     {
         (a.Y * b.Z - a.Z * b.Y).TrueValue,
         (a.Z * b.X - a.X * b.Z).TrueValue,
         (a.X * b.Y - a.Y * b.X).TrueValue,
     }, a.units + b.units));
 }
예제 #4
0
    private Quantity3 PositionAt(double timestep)
    {
        var e = orbitalElements.Eccentricity;
        var M = MeanAnomoly(orbitalElements.TrueAnomoly, e);

        var E = EccentricAnomoly(M, e);

        var P = orbitalElements.SemiMajorAxis * (Math.Cos(E) - e);
        var Q = orbitalElements.SemiMajorAxis * Math.Sin(E) * Math.Sqrt(1 - (e * e));

        var perifocal = new Quantity3(P.TrueValue, Q.TrueValue, SciNumber.Zero, orbitalElements.SemiMajorAxis.units);

        return(perifocal.Mul(orbitalElements.PerifocalToEquitorial()));
    }
예제 #5
0
    /// <param name="trueAnomoly">Provide a true anomoly to sample the orbit</param>
    public MechanicalElements ToMechanicalElements(Quantity mu, double?trueAnomoly = null)
    {
        var ta = trueAnomoly ?? this.TrueAnomoly;

        var rA = SemiMajorAxis / (1 + Eccentricity * Math.Cos(ta));

        var perifocalR = new Quantity3(rA.TrueValue * Math.Cos(ta), rA.TrueValue * Math.Sin(ta), SciNumber.Zero, rA.units);

        var vP = new SciNumber(-Math.Sin(ta));
        var vQ = new SciNumber(Eccentricity + Math.Cos(ta));

        var perifocalV = (mu / SemiMajorAxis).Sqrt <Quantity>() * new Quantity3(vP, vQ, SciNumber.Zero);

        //TODO: use doubles instead
        var pToE = PerifocalToEquitorial();

        return(new MechanicalElements()
        {
            position = perifocalR.Mul(pToE),
            velocity = perifocalV.Mul(pToE),
        });
    }
예제 #6
0
 public Quantity4(Quantity3 xyz, SciNumber w) :
     base(new List <SciNumber>() { xyz.X.TrueValue, xyz.Y.TrueValue, xyz.Z.TrueValue, w }, xyz.units)
 {
 }
예제 #7
0
 public static Quantity Dot(Quantity3 a, Quantity3 b)
 {
     return((a.X * b.X) + (a.Y * b.Y) + (a.Z * b.Z));
 }