/// <summary> /// Returns an orbit representing the defined parameters. /// </summary> /// <param name="semiMajorAxis_AU">SemiMajorAxis of orbit in AU.</param> /// <param name="eccentricity">Eccentricity of orbit.</param> /// <param name="inclination">Inclination of orbit in degrees.</param> /// <param name="longitudeOfAscendingNode">Longitude of ascending node in degrees.</param> /// <param name="argumentOfPeriapsis">Argument of periapsis in degrees.</param> /// <param name="meanAnomaly">Mean Anomaly in degrees.</param> /// <param name="epoch">reference time for these orbital elements.</param> public static OrbitDB FromAsteroidFormat([NotNull] Entity parent, double parentMass, double myMass, double semiMajorAxis_AU, double eccentricity, double inclination, double longitudeOfAscendingNode, double argumentOfPeriapsis, double meanAnomaly, DateTime epoch) { if (parent == null) { throw new ArgumentNullException(nameof(parent)); } double sma_m = Distance.AuToMt(semiMajorAxis_AU); OrbitDB orbit = new OrbitDB(parent) { SemiMajorAxis = sma_m, Eccentricity = eccentricity, Inclination_Degrees = inclination, LongitudeOfAscendingNode_Degrees = longitudeOfAscendingNode, ArgumentOfPeriapsis_Degrees = argumentOfPeriapsis, MeanAnomalyAtEpoch_Degrees = meanAnomaly, Epoch = epoch, _parentMass = parentMass, _myMass = myMass }; orbit.CalculateExtendedParameters(); return(orbit); }
/// <summary> /// Circular orbit from position. /// </summary> /// <param name="parent"></param> /// <param name="obj"></param> /// <param name="atDatetime"></param> /// <returns></returns> public static OrbitDB FromPosition(Entity parent, Entity obj, DateTime atDatetime) { var parpos = parent.GetDataBlob <PositionDB>(); var objPos = obj.GetDataBlob <PositionDB>(); var ralpos = objPos.AbsolutePosition_m - parpos.AbsolutePosition_m; var r = ralpos.Length(); var i = Math.Atan2(r, ralpos.Z); var m0 = Math.Atan2(ralpos.Y, ralpos.X); var orbit = new OrbitDB(parent) { SemiMajorAxis = r, Eccentricity = 0, Inclination_Degrees = i, LongitudeOfAscendingNode = 0, ArgumentOfPeriapsis = 0, MeanAnomalyAtEpoch = m0, Epoch = atDatetime, _parentMass = parent.GetDataBlob <MassVolumeDB>().Mass, _myMass = obj.GetDataBlob <MassVolumeDB>().Mass }; orbit.IsStationary = false; orbit.CalculateExtendedParameters(); return(orbit); }
/// <summary> /// In Meters! /// </summary> /// <param name="parent"></param> /// <param name="myMass"></param> /// <param name="parentMass"></param> /// <param name="sgp_m"></param> /// <param name="position_m"></param> /// <param name="velocity_m"></param> /// <param name="atDateTime"></param> /// <returns></returns> /// <exception cref="Exception"></exception> public static OrbitDB FromVector(Entity parent, double myMass, double parentMass, double sgp_m, Vector3 position_m, Vector3 velocity_m, DateTime atDateTime) { if (position_m.Length() > OrbitProcessor.GetSOI_AU(parent)) { throw new Exception("Entity not in target SOI"); } //var sgp = GameConstants.Science.GravitationalConstant * (myMass + parentMass) / 3.347928976e33; var ke = OrbitMath.KeplerFromPositionAndVelocity(sgp_m, position_m, velocity_m, atDateTime); OrbitDB orbit = new OrbitDB(parent) { SemiMajorAxis = ke.SemiMajorAxis, Eccentricity = ke.Eccentricity, Inclination = ke.Inclination, LongitudeOfAscendingNode = ke.LoAN, ArgumentOfPeriapsis = ke.AoP, MeanAnomalyAtEpoch = ke.MeanAnomalyAtEpoch, Epoch = atDateTime, _parentMass = parent.GetDataBlob <MassVolumeDB>().Mass, _myMass = myMass }; orbit.CalculateExtendedParameters(); var pos = OrbitProcessor.GetAbsolutePosition_m(orbit, atDateTime); return(orbit); }
/// <summary> /// In Meters /// </summary> /// <param name="parent"></param> /// <param name="myMass"></param> /// <param name="ke">in m</param> /// <param name="atDateTime"></param> /// <returns></returns> public static OrbitDB FromKeplerElements(Entity parent, double myMass, KeplerElements ke, DateTime atDateTime) { OrbitDB orbit = new OrbitDB(parent) { SemiMajorAxis = ke.SemiMajorAxis, Eccentricity = ke.Eccentricity, Inclination = ke.Inclination, LongitudeOfAscendingNode = ke.LoAN, ArgumentOfPeriapsis = ke.AoP, MeanAnomalyAtEpoch = ke.MeanAnomalyAtEpoch, Epoch = atDateTime, _parentMass = parent.GetDataBlob <MassVolumeDB>().Mass, _myMass = myMass }; orbit.IsStationary = false; orbit.CalculateExtendedParameters(); return(orbit); }
/// <summary> /// Creates on Orbit at current location from a given velocity /// </summary> /// <returns>The Orbit Does not attach the OrbitDB to the entity!</returns> /// <param name="parent">Parent. must have massdb</param> /// <param name="entity">Entity. must have massdb</param> /// <param name="velocity_m">Velocity in meters.</param> public static OrbitDB FromVelocity_m(Entity parent, Entity entity, Vector3 velocity_m, DateTime atDateTime) { var parentMass = parent.GetDataBlob <MassVolumeDB>().Mass; var myMass = entity.GetDataBlob <MassVolumeDB>().Mass; //var epoch1 = parent.Manager.ManagerSubpulses.StarSysDateTime; //getting epoch from here is incorrect as the local datetime doesn't change till after the subpulse. //var parentPos = OrbitProcessor.GetAbsolutePosition_AU(parent.GetDataBlob<OrbitDB>(), atDateTime); //need to use the parent position at the epoch var posdb = entity.GetDataBlob <PositionDB>(); posdb.SetParent(parent); var ralitivePos = posdb.RelativePosition_m;//entity.GetDataBlob<PositionDB>().AbsolutePosition_AU - parentPos; if (ralitivePos.Length() > OrbitProcessor.GetSOI_m(parent)) { throw new Exception("Entity not in target SOI"); } //var sgp = GameConstants.Science.GravitationalConstant * (myMass + parentMass) / 3.347928976e33; var sgp_m = GMath.StandardGravitationalParameter(myMass + parentMass); var ke_m = OrbitMath.KeplerFromPositionAndVelocity(sgp_m, ralitivePos, velocity_m, atDateTime); OrbitDB orbit = new OrbitDB(parent) { SemiMajorAxis = ke_m.SemiMajorAxis, Eccentricity = ke_m.Eccentricity, Inclination = ke_m.Inclination, LongitudeOfAscendingNode = ke_m.LoAN, ArgumentOfPeriapsis = ke_m.AoP, MeanAnomalyAtEpoch = ke_m.MeanAnomalyAtEpoch, Epoch = atDateTime, _parentMass = parentMass, _myMass = myMass }; orbit.CalculateExtendedParameters(); var pos = OrbitProcessor.GetPosition_m(orbit, atDateTime); var d = (pos - ralitivePos).Length(); if (d > 1) { var e = new Event(atDateTime, "Positional difference of " + Stringify.Distance(d) + " when creating orbit from velocity"); e.Entity = entity; e.SystemGuid = entity.Manager.ManagerGuid; e.EventType = EventType.Opps; //e.Faction = entity.FactionOwner; StaticRefLib.EventLog.AddEvent(e); //other info: var keta = Angle.ToDegrees(ke_m.TrueAnomalyAtEpoch); var obta = Angle.ToDegrees(OrbitProcessor.GetTrueAnomaly(orbit, atDateTime)); var tadif = Angle.ToDegrees(Angle.DifferenceBetweenRadians(keta, obta)); var pos1 = OrbitProcessor.GetPosition_m(orbit, atDateTime); var pos2 = OrbitProcessor.GetPosition_m(orbit, ke_m.TrueAnomalyAtEpoch); var d2 = (pos1 - pos2).Length(); } return(orbit); }