/// <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();
        }