Skip to content
Snippets Groups Projects
Satellite.h 5.99 KiB
#pragma once
#include "Planets.h"

//элементы радиус-вектора в экаваториальной системе координат
struct equator_elements_orbit {
	double r; // величина радиус-вектора
	double v; // линенйая скорость
	double θ; // угол между направлением линейной скорости и трансверсалью орбиты
	double i; // наклонение орбиты
	double Ω; //а долгота восходящего узла орбиты
	double u; // аргумент широты
};
//элементы радиус-вектора в меридиальной системе координат
struct meridian_elements_orbit{
	double r; // величина радиус-вектора
	double v; // линенйая скорость
	double θ; // угол между направлением линейной скорости и трансверсалью орбиты
	double i; // наклонение орбиты
	double Ω; // долгота восходящего узла орбиты
	double u; // аргумент широты
};
//Кеплеровские элементы орбиты
struct Kepler_elements_orbit {
	double a; //величина большой полуоси орбиты
	double e; //эксцентриситет орбиты
	double i; //угол наклонения орбиты в градусах
	double Ω; //долгота восходящего узла в градусах
	double ω; //аргумент перигея в градусах
	double M; //величина средней аномалии градусах
	double E; //величина эксцентрической аномалии
	double N; //истинная аномалия
	double u; //аргумент широты
	double convertGradToRad(double grad);
	double convertRadToGrad(double rad);
};

class Satellite {
private:
	const double Radius_Earth = 6378.13630; // средний радиус земли
	const double compression_earth = 1 / 298.257; //сжатие Земли
	const std::vector<double> coef_time_step{ 0.000000000000000000, 0.056262560526922147, //коэффиценты для разбития 
											  0.180240691736892365, 0.352624717113169637,  // шага на подинтервалы
											  0.547153626330555383, 0.734210177215410532,
											  0.885320946839095768, 0.977520613561287501 };
	double m_start_time; //момент запуска спутника
	double last_moment_integration; // ммомент времени после последнего интегрирования
	
	double m_As{ 1 }; // площадь поперечного сечения спутника
	double m_ms{ 1 }; // масса спутника 
	double m_ks{ 1.5 }; //эмперический коэффициент отражения
	double m_r{ 0 }; // радиус-вектор полета спутника в данный момент времени
	double m_v{ 0 }; // вектор скорости полета спутника в данный момент времени
	double m_h{ 0 }; // высота полета спуттника в данный момент времени
	double m_density{0}; //плотность атмосферы на данной высоте

	Matrix m_DCS{ 3, 1 }; // геоцентрические небесные координаты спутника
	Matrix m_DVS{ 3, 1 }; // геоцентирические небесные компоненты скорости
	Matrix m_F{ 3, 1 }; // компоненты ускорения вызванного атмосферой Земли
	
	equator_elements_orbit m_eeo{}; //экватариальный вектор состояния
	meridian_elements_orbit m_meo{}; //меридиальный вектор состояния
	Kepler_elements_orbit m_Keo{}; // Кеплеровские элементы орбиты

	std::vector<Matrix> m_A{}; //массив хранящий коэффициенты полинома

	Moon* m_moon{nullptr};
	Sun* m_sun{ nullptr };
	Earth* m_earth{ nullptr };
	
	// вычисленеие радиус-вектора полета спутника
	int calculate_r(); 
	// вычисленеи плотности амосферы
	int calculate_density();
	//вычисление вектора скорости спутника
	int calculate_V();
	// вычисление ускорения обусловленного сопротивлением атмосферы
	Matrix& calculate_F();
	// вычисление ускорения обусловленного сопротивлением атмосферы
	Matrix& recalculate_F(const Matrix& i_DVS);
	// вычисление всех ускорений на заданный момент времени
	Matrix step_calculate_F(const Matrix& i_DCS, const Matrix& i_DVS, const double step_time);
	
	//преобразовние экватариального вектора состояния в декартову ситему
	int convertStateVectorToDCe();
	//преобразовние мериадильного вектора состояния в декартову ситему
	int convertStateVectorToDCm();
	//преобразование декартовой системы в эватариальный вектор состояния
	int convertDCeTOStateVecror();
	//преобразования декартовой системы в меридиальный вектор состояния
	int convertDCmTOSteteVector();
	//преобразование Кеплеровских элементов орбиты в декартовую систму координат
	int convertKeplertoDC();
	int initialization_A();
public:
	Satellite(double time_TDB, double i_As, double i_ms, double i_ks,
		Matrix& i_DCS, Matrix& i_DVS, Moon* ptr_moon, Sun* ptr_sun, Earth* ptr_earth);
	//интегрирование на один шаг времени, в качестве параметра конечное время 
	int integration_step(double i_time);
	~Satellite() {};
};