#pragma once #include "SystemCoords.h" #include "m_time.h" static Ot _MJDt; class Moon : public ConvertSC { private: const double gravitational_parameter_Moon{ 4902.799 }; // гравитационный парметр луны const double m_scalefactor{ 6378.43817285 }; //масштабный множитель для исправления неточности господина Брауна double m_sin_πс{ 0 }; // синус паралакса double m_Δλ_c{ 0 }; double m_β{ 0 }; double m_Rm{ 0 }; // расстояние до луны в текущий момент времени double m_Ro{ 0 }; // расстояние от луны до объекта в ткущий момент времени std::vector<double> m_s{ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; std::vector<double> m_r{ 0.0, 0.0, 0.0, 0.0, 0.0 }; fundamental_arguments m_cfa{ 0.0, 0.0, 0.0, 0.0, 0.0 }; Matrix m_F{ 3, 1 }; // вектор ускорения вызванного гравитацией луны int calculate_s(); int calculate_r(); int calculateСorrecteFundamentalArg(); int calculate_sin_πс(); int calculate_Δλ_c(); int calculate_β(); int calculateRm(); int calculateRo(const Matrix& DC_coord_object); public: //время в формате TDB Moon(double input_MJD) :ConvertSC{ _MJDt.convert_MJD_to_TDB(input_MJD) } { calculateDC(); }; ~Moon() {}; int calculateGEC(double input_MJD); Matrix calculateFm(const Matrix& DC_coord_object, double input_MJD); friend std::ostream& operator<<(std::ostream& out, Moon& i_moon); friend std::ofstream& operator<<(std::ofstream& out, Moon& i_moon); }; // Параметры спутника такие как масса, поперечное сечение, эмперический коэффициент отражения struct satellite_parameters { double mass; //масса double cross_sectional_radius; //площадь поперечного сечения double reflection_coefficient; //эмперический коэффициент отражения }; class Sun :private ConvertSC { private: const double AU{ 149597870.691 }; // астрономическая единица const double gravitational_parameter_Sun{ 132712438000 }; // гравитационный параметр солнца const double light_pressure{ 4.5606e-6 }; double m_Rs{ 0 }; // расстояние до солнца в текущий момент времени double m_Ro{ 0 }; // расстояний от солнца до обхекта в текщий момент времени std::vector<double> m_M{ 0.0,0.0,0.0,0.0,0.0 }; Matrix m_perturbation{ 3,1 }; // возмущение в эклептической долготе, возмущение в эклептической широте, возмущение в расстоянии до Солнца Matrix m_F{ 3, 1 }; //вектор ускорения вызванного притяжением солнца Matrix m_P{ 3, 1 }; // вектор ускрения возванного давлением солнечного свет //возмущения в долготе обусловленные Венерой double DILong_V(); //возмущение в долготе обусловленные Марсом double DILong_M(); //Возмущения в долготе обусловленные Юпитером и Сатурном double DILong_JS(); //Возмущения в широте double DILat(); //Возмущения в расстоянии обусловленные Венрой double DIR_V(); //Возмушения в расстоянии обусловленный Марсом double DIR_M(); //Возмущения в расстоянии обусловленные Юпитером и Свтурном double DIR_JS(); int calculateRs(); int calculateRo(const Matrix& DC_coord_object); int calculateAverageAnomalies(); int calculatePerturbation(); public: //время в формате MJD Sun(double input_MJD = 0); ~Sun() {}; int calculateGEC(double input_MJD); Matrix& calculateFs(const Matrix& DC_coord_object, double input_MJD); Matrix& calculatePs(const Matrix& DC_coord_object, const satellite_parameters& i_param, double input_MJD); }; struct ratio { double Rr; double Xr; double Yr; double Zr; }; struct coord { double x; double y; double z; }; class Earth : private ConvertSC { private: double m_r; // радиус до объекта в текущий момент времени double m_h; // высота полета ratio m_ratio; coord m_u; uint32_t m_cols; //n uint32_t m_rows; //k Matrix m_ERM; //матрица вращения Земли Matrix coefficient_С = fill_matrix("coef_c.txt"); Matrix coefficient_S = fill_matrix("coef_s.txt"); Matrix m_GDTC; // прямуоугольные координаты объекта в земной СК Matrix PartialDeriv{ 4,3 }; std::vector<double> m_R; std::vector<double> m_Partial_R; /*Matrix m_R{ 1, m_cols }; Matrix m_Partial_R{ 1, m_cols };*/ Matrix m_Z{ m_rows, m_cols }; Matrix m_Partial_Z{ m_rows, m_cols }; std::vector<double> m_X; std::vector<double> m_Y; std::vector<double> m_Partial_Xx; std::vector<double> m_Partial_Xy; std::vector<double> m_Partial_Yx; std::vector<double> m_Partial_Yy; Matrix m_Q{ m_rows, m_cols }; Matrix m_Partial_Qx{ m_rows, m_cols }; Matrix m_Partial_Qy{ m_rows, m_cols }; Matrix m_F{ 3, 1 }; // компонеты ускорения вызванного притяжением земли в земных координатах Matrix m_FCS{ 3, 1 }; // компонеты ускорения вызванного притяжением земли в небесных координатах int calculate_r(); //int calculate_v(const Matrix& GEV); Matrix fill_matrix(const char fileName[]); int setRatio(); int setF(); int calculateRn(); int calculatePartialRn(); int calculateZn0(); int calculatePartialZn0(); int calculateZn_k(int k); int calculatePartialZn_k(int k); int calculateXY_k(int k); int claculatePartialXxy_k(int k); int claculatePartialYxy_k(int k); int calculateQn_k(int k); int calculatePartialQn_k(int k); int calcuclateUkn(int k, int n); int calculateF(int k); int calculatePartialDeriv(); int calculateStartParameters(); int calculateAccelerationByEarth(); int initalization(); public: const double gravitational_parameter_Earth{ 398600.4415 }; // гравитационный парматер Земли const double Radius_Earth = 6378.13630; // средний радиус земли Earth() {}; int calculateERM(double input_MJD); //время в формате MJD Earth(double input_MJD, Matrix input_GCC); ~Earth() {}; //время в модифицированных юлианских днях, координаты в прямоугольный геоцентрических небесных координатах Matrix& recalculateAccelerationCC(double input_MJD, Matrix i_GDC) { calculateERM(input_MJD); recalc(_MJDt.convert_MJD_to_TDB(input_MJD)); m_GDTC = CC_to_TC(m_precession, m_nutation, m_ERM) * i_GDC; calculateAccelerationByEarth(); return m_FCS; } Matrix& getERM() { return m_ERM; } Earth operator=(const Earth& input); };