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); }
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); }
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)); }
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())); }
/// <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), }); }
public Quantity4(Quantity3 xyz, SciNumber w) : base(new List <SciNumber>() { xyz.X.TrueValue, xyz.Y.TrueValue, xyz.Z.TrueValue, w }, xyz.units) { }
public static Quantity Dot(Quantity3 a, Quantity3 b) { return((a.X * b.X) + (a.Y * b.Y) + (a.Z * b.Z)); }