/// <summary>
        /// Gets the orbit sample points without unnecessary memory alloc for resulting array.
        /// However, memory allocation may occur if resulting array has not correct lenght.
        /// </summary>
        /// <param name="orbitPoints">The orbit points.</param>
        /// <param name="pointsCount">The points count.</param>
        /// <param name="origin">The origin.</param>
        /// <param name="maxDistance">The maximum distance.</param>
        public void GetOrbitPointsNoAlloc(ref Vector3d[] orbitPoints, int pointsCount, Vector3d origin, float maxDistance = 1000f)
        {
            if (pointsCount < 2)
            {
                orbitPoints = new Vector3d[0];
                return;
            }

            if (Eccentricity < 1)
            {
                if (orbitPoints == null || orbitPoints.Length != pointsCount)
                {
                    orbitPoints = new Vector3d[pointsCount];
                }

                if (ApoapsisDistance < maxDistance)
                {
                    for (int i = 0; i < pointsCount; i++)
                    {
                        orbitPoints[i] = GetFocalPositionAtEccentricAnomaly(i * KeplerOrbitUtils.PI_2 / (pointsCount - 1d)) + origin;
                    }
                }
                else
                {
                    double maxAngle = KeplerOrbitUtils.CalcTrueAnomalyForDistance(maxDistance, Eccentricity, SemiMajorAxis, PeriapsisDistance);
                    for (int i = 0; i < pointsCount; i++)
                    {
                        orbitPoints[i] = GetFocalPositionAtTrueAnomaly(-maxAngle + i * 2d * maxAngle / (pointsCount - 1)) + origin;
                    }
                }
            }
            else
            {
                if (maxDistance < PeriapsisDistance)
                {
                    orbitPoints = new Vector3d[0];
                    return;
                }

                if (orbitPoints == null || orbitPoints.Length != pointsCount)
                {
                    orbitPoints = new Vector3d[pointsCount];
                }

                double maxAngle = KeplerOrbitUtils.CalcTrueAnomalyForDistance(maxDistance, Eccentricity, SemiMajorAxis, PeriapsisDistance);

                for (int i = 0; i < pointsCount; i++)
                {
                    orbitPoints[i] = GetFocalPositionAtTrueAnomaly(-maxAngle + i * 2d * maxAngle / (pointsCount - 1)) + origin;
                }
            }
        }
        /// <summary>
        /// Gets orbit sample points with defined precision.
        /// </summary>
        /// <param name="pointsCount">The points count.</param>
        /// <param name="origin">The origin.</param>
        /// <param name="maxDistance">The maximum distance.</param>
        /// <returns>Array of orbit curve points.</returns>
        public Vector3d[] GetOrbitPoints(int pointsCount, Vector3d origin, double maxDistance = 1000d)
        {
            if (pointsCount < 2)
            {
                return(new Vector3d[0]);
            }

            Vector3d[] result = new Vector3d[pointsCount];
            if (Eccentricity < 1.0)
            {
                if (ApoapsisDistance < maxDistance)
                {
                    for (int i = 0; i < pointsCount; i++)
                    {
                        result[i] = GetFocalPositionAtEccentricAnomaly(i * KeplerOrbitUtils.PI_2 / (pointsCount - 1d)) + origin;
                    }
                }
                else if (Eccentricity > 1.0)
                {
                    double maxAngle = KeplerOrbitUtils.CalcTrueAnomalyForDistance(maxDistance, Eccentricity, SemiMajorAxis, PeriapsisDistance);
                    for (int i = 0; i < pointsCount; i++)
                    {
                        result[i] = GetFocalPositionAtTrueAnomaly(-maxAngle + i * 2d * maxAngle / (pointsCount - 1)) + origin;
                    }
                }
                else
                {
                    double maxAngle = KeplerOrbitUtils.CalcTrueAnomalyForDistance(maxDistance, Eccentricity, PeriapsisDistance, PeriapsisDistance);
                    for (int i = 0; i < pointsCount; i++)
                    {
                        result[i] = GetFocalPositionAtTrueAnomaly(-maxAngle + i * 2d * maxAngle / (pointsCount - 1)) + origin;
                    }
                }
            }
            else
            {
                if (maxDistance < PeriapsisDistance)
                {
                    return(new Vector3d[0]);
                }

                double maxAngle = KeplerOrbitUtils.CalcTrueAnomalyForDistance(maxDistance, Eccentricity, SemiMajorAxis, PeriapsisDistance);

                for (int i = 0; i < pointsCount; i++)
                {
                    result[i] = GetFocalPositionAtTrueAnomaly(-maxAngle + i * 2d * maxAngle / (pointsCount - 1)) + origin;
                }
            }

            return(result);
        }
Example #3
0
        /// <summary>
        /// Gets calculated orbit points with defined precision.
        /// </summary>
        /// <param name="pointsCount">The points count.</param>
        /// <param name="origin">The origin.</param>
        /// <param name="maxDistance">The maximum distance.</param>
        /// <returns>Array of orbit curve points.</returns>
        public Vector3[] GetOrbitPoints(int pointsCount, Vector3 origin, float maxDistance = 1000f)
        {
            if (pointsCount < 2)
            {
                return(new Vector3[0]);
            }
            var result = new Vector3[pointsCount];

            if (Eccentricity < 1)
            {
                if (ApoapsisDistance < maxDistance)
                {
                    for (var i = 0; i < pointsCount; i++)
                    {
                        result[i] = (Vector3)GetFocalPositionAtEccentricAnomaly(i * KeplerOrbitUtils.PI_2 / (pointsCount - 1d)) + origin;
                    }
                }
                else
                {
                    var maxAngle = KeplerOrbitUtils.CalcTrueAnomalyForDistance(maxDistance, Eccentricity, SemiMajorAxis);
                    for (int i = 0; i < pointsCount; i++)
                    {
                        result[i] = (Vector3)GetFocalPositionAtTrueAnomaly(-maxAngle + i * 2d * maxAngle / (pointsCount - 1)) + origin;
                    }
                }
            }
            else
            {
                if (maxDistance < PeriapsisDistance)
                {
                    return(new Vector3[0]);
                }
                var maxAngle = KeplerOrbitUtils.CalcTrueAnomalyForDistance(maxDistance, Eccentricity, SemiMajorAxis);

                for (int i = 0; i < pointsCount; i++)
                {
                    result[i] = (Vector3)GetFocalPositionAtTrueAnomaly(-maxAngle + i * 2d * maxAngle / (pointsCount - 1)) + origin;
                }
            }
            return(result);
        }