/// <summary> /// Gets heliocentrical coordinates of planet /// </summary> private CrdsHeliocentrical Planet_Heliocentrical(SkyContext c, int p) { // final difference to stop iteration process, 1 second of time double deltaTau = TimeSpan.FromSeconds(1).TotalDays; // time taken by the light to reach the Earth double tau = 0; // previous value of tau to calculate the difference double tau0 = 1; // Heliocentrical coordinates of planet CrdsHeliocentrical planetHeliocentrial = null; // Heliocentrical coordinates of Earth CrdsHeliocentrical hEarth = c.Get(Earth_Heliocentrial); // Iterative process to find heliocentrical coordinates of planet while (Math.Abs(tau - tau0) > deltaTau) { // Heliocentrical coordinates of planet planetHeliocentrial = PlanetPositions.GetPlanetCoordinates(p, c.JulianDay - tau, !c.PreferFastCalculation); // Ecliptical coordinates of planet var planetEcliptical = planetHeliocentrial.ToRectangular(hEarth).ToEcliptical(); tau0 = tau; tau = PlanetPositions.LightTimeEffect(planetEcliptical.Distance); } return(planetHeliocentrial); }
public void CalculatePlanetApparentPlaceLP() { double jde = 2448976.5; double tau = 0; CrdsEcliptical ecl = null; for (int i = 0; i < 2; i++) { CrdsHeliocentrical hEarth = PlanetPositions.GetPlanetCoordinates(3, jde - tau, highPrecision: false); CrdsHeliocentrical hVenus = PlanetPositions.GetPlanetCoordinates(2, jde - tau, highPrecision: false); var rect = hVenus.ToRectangular(hEarth); ecl = rect.ToEcliptical(); tau = PlanetPositions.LightTimeEffect(ecl.Distance); } // Correction for FK5 system CrdsEcliptical corr = PlanetPositions.CorrectionForFK5(jde, ecl); ecl += corr; ecl += Nutation.NutationEffect(16.749 / 3600.0); CrdsEquatorial eq = ecl.ToEquatorial(23.439669); Assert.AreEqual(new HMS("21h 04m 41.459s"), new HMS(eq.Alpha)); Assert.AreEqual(new DMS("-18* 53' 16.66''"), new DMS(eq.Delta)); }
public void GetPlanetCoordinatesLP() { // Example 32.a from AA { CrdsHeliocentrical crds = PlanetPositions.GetPlanetCoordinates(Planet.Venus, 2448976.5, highPrecision: false); Assert.AreEqual(26.11428, crds.L, 1e-5); Assert.AreEqual(-2.62070, crds.B, 1e-5); Assert.AreEqual(0.724603, crds.R, 1e-6); } // Test low-precision implementation from AA2 book foreach (VSOP87DTestData testValue in testData) { CrdsHeliocentrical crds = PlanetPositions.GetPlanetCoordinates(testValue.Planet, testValue.JDE, highPrecision: false); double deltaL = Math.Abs(testValue.L - crds.L) * SECONDS_IN_DEGREE; double deltaB = Math.Abs(testValue.B - crds.B) * SECONDS_IN_DEGREE; double deltaR = Math.Abs(testValue.R - crds.R); // difference in L should be less than 4" of arc Assert.IsTrue(deltaL < 4); // difference in B should be less than 4" of arc Assert.IsTrue(deltaB < 4); // difference in R should be less than 1e-3 AU Assert.IsTrue(deltaR < 1e-3); } }
public void GetSolarCoordinatesLP() { double jde = 2448908.5; // get Earth coordinates CrdsHeliocentrical crds = PlanetPositions.GetPlanetCoordinates(Planet.Earth, jde, highPrecision: false); Assert.AreEqual(19.907372, crds.L, 1e-6); Assert.AreEqual(-0.644, crds.B * 3600, 1e-3); Assert.AreEqual(0.99760775, crds.R, 1e-8); // transform to ecliptical coordinates of the Sun CrdsEcliptical ecl = new CrdsEcliptical(Angle.To360(crds.L + 180), -crds.B, crds.R); // get FK5 system correction CrdsEcliptical corr = PlanetPositions.CorrectionForFK5(jde, ecl); Assert.AreEqual(-0.09033, corr.Lambda * 3600, 1e-5); Assert.AreEqual(-0.023, corr.Beta * 3600, 1e-3); // correct solar coordinates to FK5 system ecl += corr; Assert.AreEqual(199.907347, ecl.Lambda, 1e-6); Assert.AreEqual(0.62, ecl.Beta * 3600, 1e-2); Assert.AreEqual(0.99760775, ecl.Distance, 1e-8); var nutation = Nutation.NutationElements(jde); // True obliquity double epsilon = Date.TrueObliquity(jde, nutation.deltaEpsilon); // accuracy is 0.5" Assert.AreEqual(15.908, nutation.deltaPsi * 3600, 0.5); // accuracyis 0.1" Assert.AreEqual(-0.308, nutation.deltaEpsilon * 3600, 0.1); // accuracy is 0.1" Assert.AreEqual(23.4401443, epsilon, 0.1 / 3600.0); // add nutation effect ecl += Nutation.NutationEffect(nutation.deltaPsi); // calculate aberration effect CrdsEcliptical aberration = Aberration.AberrationEffect(ecl.Distance); Assert.AreEqual(-20.539, aberration.Lambda * 3600.0, 1e-3); // add aberration effect ecl += aberration; // convert ecliptical to equatorial coordinates CrdsEquatorial eq = ecl.ToEquatorial(epsilon); // check apparent equatorial coordinates // assume an accuracy of 0.5'' is sufficient Assert.AreEqual(198.378178, eq.Alpha, 1.0 / 3600 * 0.5); Assert.AreEqual(-7.783871, eq.Delta, 1.0 / 3600 * 0.5); }
/// <summary> /// Gets ecliptical coordinates of Sun for J2000.0 epoch /// </summary> private CrdsEcliptical SunEcliptical(SkyContext c) { CrdsHeliocentrical hEarth = PlanetPositions.GetPlanetCoordinates(3, c.JulianDay, !c.PreferFastCalculation, false); var eSun = new CrdsEcliptical(Angle.To360(hEarth.L + 180), -hEarth.B, hEarth.R); // Corrected solar coordinates to FK5 system // NO correction for nutation and aberration should be performed here (ch. 26, p. 171) eSun += PlanetPositions.CorrectionForFK5(c.JulianDay, eSun); return(eSun); }
private CrdsRectangular SunRectangular(double jd, double epsilon) { CrdsHeliocentrical hEarth = PlanetPositions.GetPlanetCoordinates(3, jd, true, false); var eSun = new CrdsEcliptical(Angle.To360(hEarth.L + 180), -hEarth.B, hEarth.R); // Corrected solar coordinates to FK5 system // NO correction for nutation and aberration should be performed here (ch. 26, p. 171) eSun += PlanetPositions.CorrectionForFK5(jd, eSun); return(eSun.ToRectangular(epsilon)); }
public void SaturnRings() { double jd = 2448972.5 + 0.00068; CrdsHeliocentrical earth = PlanetPositions.GetPlanetCoordinates(3, jd, true); CrdsHeliocentrical saturn = PlanetPositions.GetPlanetCoordinates(6, jd, true); RingsAppearance rings = PlanetEphem.SaturnRings(jd, saturn, earth, 23.43971); Assert.AreEqual(35.87, rings.a, 1e-2); Assert.AreEqual(10.15, rings.b, 1e-2); Assert.AreEqual(16.442, rings.B, 1e-3); Assert.AreEqual(4.198, rings.DeltaU, 1e-3); Assert.AreEqual(6.741, rings.P, 1e-3); }
public void CalculatePlanetApparentPlaceHP() { double jde = 2448976.5; // time taken by the light to reach the Earth double tau = 0; // previous value of tau to calculate the difference double tau0 = 1; // final difference to stop iteration process, 1 second of time double deltaTau = TimeSpan.FromSeconds(1).TotalDays; // Ecliptical coordinates of Venus CrdsEcliptical ecl = null; // Iterative process to find ecliptical coordinates of Venus while (Math.Abs(tau - tau0) > deltaTau) { // Heliocentrical coordinates of Earth var hEarth = PlanetPositions.GetPlanetCoordinates(3, jde - tau, highPrecision: true); // Heliocentrical coordinates of Venus var hVenus = PlanetPositions.GetPlanetCoordinates(2, jde - tau, highPrecision: true); // Ecliptical coordinates of Venus ecl = hVenus.ToRectangular(hEarth).ToEcliptical(); tau0 = tau; tau = PlanetPositions.LightTimeEffect(ecl.Distance); } // Correction for FK5 system ecl += PlanetPositions.CorrectionForFK5(jde, ecl); // Take nutation into account ecl += Nutation.NutationEffect(16.749 / 3600.0); // Apparent equatorial coordinates of Venus CrdsEquatorial eq = ecl.ToEquatorial(23.439669); Assert.AreEqual(new HMS("21h 04m 41.454s"), new HMS(eq.Alpha)); Assert.AreEqual(new DMS("-18* 53' 16.84''"), new DMS(eq.Delta)); }
public void GetPlanetCoordinatesHP() { // Test high-precision implementation from original VSOP87 theory. foreach (VSOP87DTestData testValue in testData) { CrdsHeliocentrical crds = PlanetPositions.GetPlanetCoordinates(testValue.Planet, testValue.JDE, highPrecision: true, epochOfDate: testValue.IsEpochOfDate); double deltaL = Math.Abs(testValue.L - crds.L) * SECONDS_IN_DEGREE; double deltaB = Math.Abs(testValue.B - crds.B) * SECONDS_IN_DEGREE; double deltaR = Math.Abs(testValue.R - crds.R); // difference in L should be less than 1" of arc Assert.IsTrue(deltaL < 1); // difference in B should be less than 1" of arc Assert.IsTrue(deltaB < 1); // difference in R should be less than 1e-5 AU Assert.IsTrue(deltaR < 1e-5); } }
public CrdsEcliptical Ecliptical(SkyContext c) { // get Earth coordinates CrdsHeliocentrical crds = PlanetPositions.GetPlanetCoordinates(Planet.EARTH, c.JulianDay, highPrecision: true); // transform to ecliptical coordinates of the Sun var ecl = new CrdsEcliptical(Angle.To360(crds.L + 180), -crds.B, crds.R); // get FK5 system correction CrdsEcliptical corr = PlanetPositions.CorrectionForFK5(c.JulianDay, ecl); // correct solar coordinates to FK5 system ecl += corr; // add nutation effect ecl += Nutation.NutationEffect(c.NutationElements.deltaPsi); // add aberration effect ecl += Aberration.AberrationEffect(ecl.Distance); return(ecl); }
public void GetSolarCoordinatesLP() { double jde = 2448908.5; // get Earth coordinates CrdsHeliocentrical crds = PlanetPositions.GetPlanetCoordinates(3, jde, highPrecision: false); // transform to ecliptical coordinates of the Sun CrdsEcliptical ecl = new CrdsEcliptical(Angle.To360(crds.L + 180), -crds.B, crds.R); // get FK5 system correction CrdsEcliptical corr = PlanetPositions.CorrectionForFK5(jde, ecl); // correct solar coordinates to FK5 system ecl += corr; var nutation = Nutation.NutationElements(jde); // True obliquity double epsilon = Date.TrueObliquity(jde, nutation.deltaEpsilon); // add nutation effect ecl += Nutation.NutationEffect(nutation.deltaPsi); // calculate aberration effect CrdsEcliptical aberration = Aberration.AberrationEffect(ecl.Distance); // add aberration effect ecl += aberration; // convert ecliptical to equatorial coordinates CrdsEquatorial eq = ecl.ToEquatorial(epsilon); // check apparent equatorial coordinates // assume an accuracy of 0.5'' is sufficient Assert.AreEqual(198.378178, eq.Alpha, 1.0 / 3600 * 0.5); Assert.AreEqual(-7.783871, eq.Delta, 1.0 / 3600 * 0.5); }
/// <summary> /// Get heliocentrical coordinates of Earth /// </summary> private CrdsHeliocentrical Earth_Heliocentrial(SkyContext c) { return(PlanetPositions.GetPlanetCoordinates(Planet.EARTH, c.JulianDay, !c.PreferFastCalculation)); }
public void Position() { // Mean obliquity of the ecliptic for J2000.0 epoch const double epsilonJ2000 = 23.4392912510; double jd = 2448908.5; double tau = 0; double tau0 = 1; int iteration = 1; // final difference to stop iteration process, 1 second of time double deltaTau = TimeSpan.FromSeconds(1).TotalDays; CrdsHeliocentrical posPluto = null; CrdsHeliocentrical hEarth = null; while (Math.Abs(tau - tau0) > deltaTau) { posPluto = PlutoPosition.Position(jd - tau); if (iteration == 1) { Assert.AreEqual(232.74071, posPluto.L, 1e-5); Assert.AreEqual(14.58782, posPluto.B, 1e-5); Assert.AreEqual(29.711111, posPluto.R, 1e-6); } else if (iteration == 2) { Assert.AreEqual(232.73949, posPluto.L, 1e-5); Assert.AreEqual(14.58801, posPluto.B, 1e-5); Assert.AreEqual(29.711094, posPluto.R, 1e-6); } // get Earth coordinates hEarth = PlanetPositions.GetPlanetCoordinates(3, jd, highPrecision: false, epochOfDate: false); // transform to ecliptical coordinates of the Sun CrdsEcliptical eclSun = new CrdsEcliptical(Angle.To360(hEarth.L + 180), -hEarth.B, hEarth.R); CrdsRectangular rSun = eclSun.ToRectangular(epsilonJ2000); if (iteration == 1) { Assert.AreEqual(-0.9373959, rSun.X, 1e-6); Assert.AreEqual(-0.3131679, rSun.Y, 1e-6); Assert.AreEqual(-0.1357792, rSun.Z, 1e-6); } var rPluto = new CrdsEcliptical(posPluto.L, posPluto.B, posPluto.R).ToRectangular(epsilonJ2000); if (iteration == 1) { Assert.AreEqual(-17.4079141, rPluto.X, 1e-5); Assert.AreEqual(-23.9730804, rPluto.Y, 1e-5); Assert.AreEqual(-2.2374228, rPluto.Z, 1e-5); } else if (iteration == 2) { Assert.AreEqual(-17.4083780, rPluto.X, 1e-5); Assert.AreEqual(-23.9727452, rPluto.Y, 1e-5); Assert.AreEqual(-2.2371797, rPluto.Z, 1e-5); } double x = rPluto.X + rSun.X; double y = rPluto.Y + rSun.Y; double z = rPluto.Z + rSun.Z; double dist = Math.Sqrt(x * x + y * y + z * z); if (iteration == 1) { Assert.AreEqual(30.528746, dist, 1e-5); } else if (iteration == 2) { Assert.AreEqual(30.528739, dist, 1e-5); } tau0 = tau; tau = PlanetPositions.LightTimeEffect(dist); if (iteration == 1 || iteration == 2) { Assert.AreEqual(0.17632, tau, 1e-5); } iteration++; } // should be only 2 iterations Assert.AreEqual(2, iteration - 1); // ecliptical coordinates of Pluto, J2000.0 epoch var eclPluto = posPluto.ToRectangular(hEarth).ToEcliptical(); // geocentric astrometric equatorial coordinates of Pluto, J2000.0 epoch var eqPluto2000 = eclPluto.ToEquatorial(epsilonJ2000); // check coordinates with possible error with 1 arcsecond Assert.AreEqual(new HMS("15h 31m 43.8s").ToDecimalAngle(), eqPluto2000.Alpha, 1 / 3600.0); Assert.AreEqual(new DMS("-4* 27' 29''").ToDecimalAngle(), eqPluto2000.Delta, 1 / 3600.0); }
/// <summary> /// Gets helipcentrical coordinates of Earth /// </summary> private CrdsHeliocentrical EarthHeliocentrical(SkyContext c) { return(PlanetPositions.GetPlanetCoordinates(Planet.EARTH, c.JulianDay, highPrecision: true)); }
public async Task SetDate(Date date, CrdsGeographical geoLocation) { await Task.Run(() => { double jd0 = date.ToJulianEphemerisDay(); daysInMonth = Date.DaysInMonth(date.Year, date.Month); var eL = new PointF[5]; var eB = new PointF[5]; var eR = new PointF[5]; var jL = new PointF[5]; var jB = new PointF[5]; var jR = new PointF[5]; var earth = new CrdsHeliocentrical[5]; var jupiter = new CrdsHeliocentrical[5]; // calculate heliocentrical positions of Earth and Jupiter for 5 instants // and find least squares approximation model of planets position // to quick calculation of Galilean moons postions. for (int i = 0; i < 5; i++) { double jd = jd0 + (i / 4.0) * daysInMonth; earth[i] = PlanetPositions.GetPlanetCoordinates(3, jd); jupiter[i] = PlanetPositions.GetPlanetCoordinates(5, jd); } double[] earthL = earth.Select(x => x.L).ToArray(); double[] earthB = earth.Select(x => x.B).ToArray(); double[] earthR = earth.Select(x => x.R).ToArray(); double[] jupiterL = jupiter.Select(x => x.L).ToArray(); double[] jupiterB = jupiter.Select(x => x.B).ToArray(); double[] jupiterR = jupiter.Select(x => x.R).ToArray(); // it's important to align longitudes (avoid 0 degrees crossing) // before applying least squares method earthL = Angle.Align(earthL); jupiterL = Angle.Align(jupiterL); for (int i = 0; i < 5; i++) { eL[i] = new PointF(i, (float)earthL[i]); eB[i] = new PointF(i, (float)earthB[i]); eR[i] = new PointF(i, (float)earthR[i]); jL[i] = new PointF(i, (float)jupiterL[i]); jB[i] = new PointF(i, (float)jupiterB[i]); jR[i] = new PointF(i, (float)jupiterR[i]); } Begin = jd0; End = jd0 + daysInMonth; GeoLocation = geoLocation; this.eL = LeastSquares.FindCoeffs(eL, 3); this.eB = LeastSquares.FindCoeffs(eB, 3); this.eR = LeastSquares.FindCoeffs(eR, 3); this.jL = LeastSquares.FindCoeffs(jL, 3); this.jB = LeastSquares.FindCoeffs(jB, 3); this.jR = LeastSquares.FindCoeffs(jR, 3); }); }
/// <summary> /// Calculates heliocentrical coordinates of Earth for J2000 epoch /// </summary> private CrdsHeliocentrical Earth_HeliocentricalJ2000(SkyContext c) { return(PlanetPositions.GetPlanetCoordinates(Planet.EARTH, c.JulianDay, highPrecision: !c.PreferFastCalculation, epochOfDate: false)); }