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