/// <summary> /// Create and initialize new orbit state from orbital elements. /// </summary> /// <param name="eccentricity">Eccentricity.</param> /// <param name="semiMajorAxis">Main axis semi width.</param> /// <param name="meanAnomalyDeg">Mean anomaly in degrees.</param> /// <param name="inclinationDeg">Orbit inclination in degrees.</param> /// <param name="argOfPerifocusDeg">Orbit argument of perifocus in degrees.</param> /// <param name="ascendingNodeDeg">Longitude of ascending node in degrees.</param> /// <param name="attractorMass">Attractor mass.</param> /// <param name="gConst">Gravitational constant.</param> public KeplerOrbitData(double eccentricity, double semiMajorAxis, double meanAnomalyDeg, double inclinationDeg, double argOfPerifocusDeg, double ascendingNodeDeg, double attractorMass, double gConst) { this.Eccentricity = eccentricity; this.SemiMajorAxis = semiMajorAxis; if (eccentricity < 1.0) { this.SemiMinorAxis = SemiMajorAxis * Math.Sqrt(1 - Eccentricity * Eccentricity); } else if (eccentricity > 1.0) { this.SemiMinorAxis = SemiMajorAxis * Math.Sqrt(Eccentricity * Eccentricity - 1); } else { this.SemiMajorAxis = 0; } var normal = EclipticNormal.normalized; var ascendingNode = EclipticRight.normalized; ascendingNodeDeg %= 360; if (ascendingNodeDeg > 180) { ascendingNodeDeg -= 360; } inclinationDeg %= 360; if (inclinationDeg > 180) { inclinationDeg -= 360; } argOfPerifocusDeg %= 360; if (argOfPerifocusDeg > 180) { argOfPerifocusDeg -= 360; } ascendingNode = KeplerOrbitUtils.RotateVectorByAngle(ascendingNode, ascendingNodeDeg * KeplerOrbitUtils.Deg2Rad, normal).normalized; normal = KeplerOrbitUtils.RotateVectorByAngle(normal, inclinationDeg * KeplerOrbitUtils.Deg2Rad, ascendingNode).normalized; Periapsis = ascendingNode; Periapsis = KeplerOrbitUtils.RotateVectorByAngle(Periapsis, argOfPerifocusDeg * KeplerOrbitUtils.Deg2Rad, normal).normalized; this.SemiMajorAxisBasis = Periapsis; this.SemiMinorAxisBasis = Vector3d.Cross(Periapsis, normal); this.MeanAnomaly = meanAnomalyDeg * KeplerOrbitUtils.Deg2Rad; this.EccentricAnomaly = KeplerOrbitUtils.ConvertMeanToEccentricAnomaly(this.MeanAnomaly, this.Eccentricity); this.TrueAnomaly = KeplerOrbitUtils.ConvertEccentricToTrueAnomaly(this.EccentricAnomaly, this.Eccentricity); this.AttractorMass = attractorMass; this.GravConst = gConst; CalculateOrbitStateFromOrbitalElements(); }