diff --git a/Eci.cpp b/Eci.cpp index 3e90f0c..b1b34ad 100644 --- a/Eci.cpp +++ b/Eci.cpp @@ -43,6 +43,11 @@ Eci::Eci(const Julian &date, const CoordGeodetic &geo) velocity_.SetW(velocity_.GetMagnitude()); } +Eci::Eci(const Julian &date, const Vector &position) +: date_(date), position_(position) { + +} + Eci::Eci(const Julian &date, const Vector &position, const Vector &velocity) : date_(date), position_(position), velocity_(velocity) { diff --git a/Eci.h b/Eci.h index 340fd28..a9c9b6d 100644 --- a/Eci.h +++ b/Eci.h @@ -11,6 +11,7 @@ public: Eci() { }; Eci(const Julian &date, const CoordGeodetic &geo); + Eci(const Julian &date, const Vector &position); Eci(const Julian &date, const Vector &position, const Vector &velocity); virtual ~Eci(void); diff --git a/Globals.h b/Globals.h index 9910f25..1dde008 100644 --- a/Globals.h +++ b/Globals.h @@ -26,6 +26,10 @@ public: return 1.00273790934; } + static const double AU() { + return 1.49597870691e8; + } + static const double XKMPER() { return 6378.135; } diff --git a/Rewrite.vcxproj b/Rewrite.vcxproj index cba0858..af6c1ed 100644 --- a/Rewrite.vcxproj +++ b/Rewrite.vcxproj @@ -83,6 +83,7 @@ + @@ -97,6 +98,7 @@ + diff --git a/Rewrite.vcxproj.filters b/Rewrite.vcxproj.filters index 3799d23..0422618 100644 --- a/Rewrite.vcxproj.filters +++ b/Rewrite.vcxproj.filters @@ -51,6 +51,9 @@ Source Files + + Source Files + @@ -89,5 +92,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/SolarPosition.cpp b/SolarPosition.cpp new file mode 100644 index 0000000..447784e --- /dev/null +++ b/SolarPosition.cpp @@ -0,0 +1,52 @@ +#include "SolarPosition.h" + +#include "Globals.h" + +#include + +SolarPosition::SolarPosition(void) { +} + +SolarPosition::~SolarPosition(void) { +} + +void SolarPosition::FindPosition(const Julian& j, Eci& eci) { + + const double mjd = j.FromJan1_12h_1900(); + const double year = 1900 + mjd / 365.25; + const double T = (mjd + Delta_ET(year) / Globals::SEC_PER_DAY()) / 36525.0; + const double M = Globals::Deg2Rad(Modulus(358.47583 + Modulus(35999.04975 * T, 360.0) + - (0.000150 + 0.0000033 * T) * T * T, 360.0)); + const double L = Globals::Deg2Rad(Modulus(279.69668 + Modulus(36000.76892 * T, 360.0) + + 0.0003025 * T*T, 360.0)); + const double e = 0.01675104 - (0.0000418 + 0.000000126 * T) * T; + const double C = Globals::Deg2Rad((1.919460 - (0.004789 + 0.000014 * T) * T) * sin(M) + + (0.020094 - 0.000100 * T) * sin(2 * M) + 0.000293 * sin(3 * M)); + const double O = Globals::Deg2Rad(Modulus(259.18 - 1934.142 * T, 360.0)); + const double Lsa = Modulus(L + C - Globals::Deg2Rad(0.00569 - 0.00479 * sin(O)), Globals::TWOPI()); + const double nu = Modulus(M + C, Globals::TWOPI()); + double R = 1.0000002 * (1 - e * e) / (1 + e * cos(nu)); + const double eps = Globals::Deg2Rad(23.452294 - (0.0130125 + (0.00000164 - + 0.000000503 * T) * T) * T + 0.00256 * cos(O)); + R = R * Globals::AU(); + + Vector solar_position = Vector(R * cos(Lsa), + R * sin(Lsa) * cos(eps), + R * sin(Lsa) * sin(eps), + R); + + eci = Eci(j, solar_position); +} + +double SolarPosition::Modulus(double arg1, double arg2) const { + + double result = arg1 - arg2 * floor(arg1 / arg2); + if (result < 0.0) + result += arg2; + return result; +} + +double SolarPosition::Delta_ET(double year) const { + + return 26.465 + 0.747622 * (year - 1950) + 1.886913 * sin(Globals::TWOPI() * (year - 1975) / 33); +} diff --git a/SolarPosition.h b/SolarPosition.h new file mode 100644 index 0000000..6c80aa6 --- /dev/null +++ b/SolarPosition.h @@ -0,0 +1,19 @@ +#ifndef SOLARPOSITION_H_ +#define SOLARPOSITION_H_ + +#include "Julian.h" +#include "Eci.h" + +class SolarPosition { +public: + SolarPosition(void); + virtual ~SolarPosition(void); + + void FindPosition(const Julian& j, Eci& eci); + +private: + double Modulus(double arg1, double arg2) const; + double Delta_ET(double year) const; +}; + +#endif