Newer
Older
#pragma once
#include "SystemCoords.h"
#include "m_time.h"
static Ot _MJDt;
GASpiridonov
committed
const double gravitational_parameter_Moon{ 4902.799 }; // гравитационный парметр луны
const double m_scalefactor{ 6378.43817285 }; //масштабный множитель для исправления неточности господина Брауна
GASpiridonov
committed
double m_Δλ_c{ 0 };
double m_β{ 0 };
GASpiridonov
committed
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 };
GASpiridonov
committed
Matrix m_F{ 3, 1 }; // вектор ускорения вызванного гравитацией луны
int calculate_s();
int calculate_r();
int calculateСorrecteFundamentalArg();
int calculate_sin_πс();
int calculate_Δλ_c();
int calculate_β();
GASpiridonov
committed
int calculateRm();
int calculateRo(const Matrix& DC_coord_object);
//время в формате 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:
GASpiridonov
committed
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 }; // расстояний от солнца до обхекта в текщий момент времени
GASpiridonov
committed
std::vector<double> m_M{ 0.0,0.0,0.0,0.0,0.0 };
Matrix m_perturbation{ 3,1 }; // возмущение в эклептической долготе, возмущение в эклептической широте, возмущение в расстоянии до Солнца
GASpiridonov
committed
Matrix m_F{ 3, 1 }; //вектор ускорения вызванного притяжением солнца
Matrix m_P{ 3, 1 }; // вектор ускрения возванного давлением солнечного свет
//возмущения в долготе обусловленные Венерой
double DILong_V();
GASpiridonov
committed
//возмущение в долготе обусловленные Марсом
double DILong_M();
GASpiridonov
committed
//Возмущения в долготе обусловленные Юпитером и Сатурном
double DILong_JS();
GASpiridonov
committed
//Возмущения в широте
double DILat();
GASpiridonov
committed
//Возмущения в расстоянии обусловленные Венрой
double DIR_V();
GASpiridonov
committed
//Возмушения в расстоянии обусловленный Марсом
double DIR_M();
GASpiridonov
committed
//Возмущения в расстоянии обусловленные Юпитером и Свтурном
double DIR_JS();
GASpiridonov
committed
int calculateRs();
int calculateRo(const Matrix& DC_coord_object);
int calculateAverageAnomalies();
int calculatePerturbation();
GASpiridonov
committed
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);
};
GASpiridonov
committed
struct ratio {
double Rr;
double Xr;
double Yr;
double Zr;
};
struct coord {
double x;
double y;
double z;
};
class Earth : private ConvertSC {
private:
GASpiridonov
committed
double m_r; // радиус до объекта в текущий момент времени
double m_h; // высота полета
GASpiridonov
committed
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 };*/
GASpiridonov
committed
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;
GASpiridonov
committed
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 }; // компонеты ускорения вызванного притяжением земли в небесных координатах
GASpiridonov
committed
int calculate_r();
//int calculate_v(const Matrix& GEV);
Matrix fill_matrix(const char fileName[]);
GASpiridonov
committed
int setRatio();
int setF();
GASpiridonov
committed
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);
GASpiridonov
committed
int calcuclateUkn(int k, int n);
int calculateF(int k);
int calculatePartialDeriv();
int calculateStartParameters();
int calculateAccelerationByEarth();
public:
const double gravitational_parameter_Earth{ 398600.4415 }; // гравитационный парматер Земли
const double Radius_Earth = 6378.13630; // средний радиус земли
//время в формате 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;
GASpiridonov
committed
calculateAccelerationByEarth();
GASpiridonov
committed
}
Earth operator=(const Earth& input);