Skip to content

Commit e0c667e

Browse files
Merge pull request #231
* Compute time to given radius
1 parent c5e1a13 commit e0c667e

File tree

3 files changed

+67
-5
lines changed

3 files changed

+67
-5
lines changed

IO.Astrodynamics.Net/IO.Astrodynamics.Tests/OrbitalParameters/KeplerianElementsTests.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ public void ParabolicToState()
458458
var ke2 = sv.ToKeplerianElements();
459459
Assert.Equal(ke, ke2, TestHelpers.KeplerComparer);
460460
}
461-
461+
462462
[Fact]
463463
public void EllipticToState()
464464
{
@@ -474,7 +474,7 @@ public void EllipticToState()
474474
Assert.Equal(ke.Epoch, ke2.Epoch);
475475
Assert.Equal(ke.Observer, ke2.Observer);
476476
}
477-
477+
478478
[Fact]
479479
public void HyperbolicToEquinoctial()
480480
{
@@ -493,14 +493,14 @@ public void ParabolicToEquinoctial()
493493
var ke2 = eq.ToKeplerianElements();
494494
Assert.Equal(ke, ke2, TestHelpers.KeplerComparer);
495495
}
496-
496+
497497
[Fact]
498498
public void EllipticToEquinoctial()
499499
{
500500
var ke = new KeplerianElements(6800000.0, 0.2, 0.2, 0.3, 0.4, 0.5, TestHelpers.EarthAtJ2000, TimeSystem.Time.J2000TDB, Frames.Frame.ICRF);
501501
var eq = ke.ToEquinoctial();
502502
var ke2 = eq.ToKeplerianElements();
503-
Assert.Equal(ke,ke2, TestHelpers.KeplerComparer);
503+
Assert.Equal(ke, ke2, TestHelpers.KeplerComparer);
504504
}
505505

506506
[Fact]
@@ -522,5 +522,31 @@ public void ParabolicPerigeeRadius()
522522
new TimeSystem.Time(DateTime.Now, TimeFrame.TDBFrame), Frames.Frame.ICRF, perigeeRadius: 6800000.0);
523523
Assert.Equal(6800000.0, ke.PerigeeRadius(), 6);
524524
}
525+
526+
[Fact]
527+
public void TimeToApogeeRadius()
528+
{
529+
var epoch = TimeSystem.Time.J2000TDB;
530+
KeplerianElements ke = new KeplerianElements(8000000.0, 0.5, 30.0 * IO.Astrodynamics.Constants.Deg2Rad,
531+
40.0 * IO.Astrodynamics.Constants.Deg2Rad, 50.0 * IO.Astrodynamics.Constants.Deg2Rad, 0.0, TestHelpers.EarthAtJ2000,
532+
epoch, Frames.Frame.ICRF);
533+
var orbitalPeriod = ke.Period();
534+
var expectedApogeeTime = epoch + 0.5 * orbitalPeriod;
535+
var apogeeRadius = ke.ApogeeVector().Magnitude();
536+
Assert.Equal(expectedApogeeTime, ke.TimeToRadius(apogeeRadius), TestHelpers.TimeComparer);
537+
}
538+
539+
[Fact]
540+
public void TimeToPerigeeRadius()
541+
{
542+
var epoch = TimeSystem.Time.J2000TDB;
543+
KeplerianElements ke = new KeplerianElements(8000000.0, 0.5, 30.0 * IO.Astrodynamics.Constants.Deg2Rad,
544+
40.0 * IO.Astrodynamics.Constants.Deg2Rad, 50.0 * IO.Astrodynamics.Constants.Deg2Rad, Astrodynamics.Constants.PI, TestHelpers.EarthAtJ2000,
545+
epoch, Frames.Frame.ICRF);
546+
var orbitalPeriod = ke.Period();
547+
var expectedApogeeTime = epoch + 0.5 * orbitalPeriod;
548+
var perigeeRadius = ke.PerigeeVector().Magnitude();
549+
Assert.Equal(expectedApogeeTime, ke.TimeToRadius(perigeeRadius), TestHelpers.TimeComparer);
550+
}
525551
}
526552
}

IO.Astrodynamics.Net/IO.Astrodynamics/OrbitalParameters/KeplerianElements.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ public override double MeanAnomaly()
165165
return M;
166166
}
167167

168+
169+
168170
#region Operator
169171

170172
public bool Equals(KeplerianElements other)

IO.Astrodynamics.Net/IO.Astrodynamics/OrbitalParameters/OrbitalParameters.cs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,41 @@ public double SemiLatusRectum()
935935
return hNorm * hNorm / Observer.GM;
936936
}
937937

938-
938+
/// <summary>
939+
/// Computes the time to reach a given radius.
940+
/// </summary>
941+
/// <param name="radius"></param>
942+
/// <returns></returns>
943+
public Time TimeToRadius(double radius)
944+
{
945+
// Extract orbital elements
946+
double e = Eccentricity(); // Eccentricity
947+
948+
// Semi-latus rectum
949+
double p = SemiLatusRectum();
950+
951+
// Compute the true anomaly at the radius
952+
double cosNuRad = System.Math.Clamp((p / radius - 1) / e, -1.0, 1.0);
953+
double nuRad = System.Math.Acos(cosNuRad);
954+
955+
return EpochAtMeanAnomaly(TrueAnomalyToMeanAnomaly(nuRad, e, EccentricAnomaly(nuRad)));
956+
}
957+
958+
/// <summary>
959+
/// Computes the time to reach the sphere of influence of the center of motion.
960+
/// </summary>
961+
/// <returns></returns>
962+
/// <exception cref="InvalidOperationException">The observer must be a celestial body to compute the time to the sphere of influence.</exception>
963+
public Time TimeToSphereOfInfluence()
964+
{
965+
var centerOfMotion = Observer as CelestialBody;
966+
if (centerOfMotion is null)
967+
{
968+
throw new InvalidOperationException("The observer must be a celestial body to compute the time to the sphere of influence.");
969+
}
970+
971+
return TimeToRadius(centerOfMotion.SphereOfInfluence);
972+
}
939973

940974
#region Operators
941975

0 commit comments

Comments
 (0)