Skip to content
Snippets Groups Projects
Satellite.cpp 14.63 KiB
#include "Satellite.h"

int Satellite::satellite_number = 0;
const std::vector<double> Satellite::coef_time_step { 0.000000000000000000, 0.056262560526922147, //коэффиценты для разбития 
							     					  0.180240691736892365, 0.352624717113169637,  // шага на подинтервалы
                                                      0.547153626330555383, 0.734210177215410532,
										              0.885320946839095768, 0.977520613561287501 };

double calc_i(const double c, const double c1, const double c2, const double c3) {
	if (c3 >= 0) return acos(c3 / c);
	else if (c3 == 0 && (pow(c1, 2) + pow(c2, 2) != 0)) return (M_PI_2);
	else if (c3 < 0) return (M_PI - acos(c3 / c));
	else return -2;
}

double calc_Ω(const double c1, const double c2) {
	if (c1 >= 0 && c2 <= 0) return atan(c1 / c2);
	else if ((c1 >= 0) && (c2 > 0)) return (M_PI - atan(c1 / c2));
	else if ((c1 < 0) && (c2 >= 0)) return (M_PI + atan(c1 / c2));
	else if ((c1 < 0) && (c2 < 0)) return (2 * M_PI - atan(c1 / c2));
	return -2;
}

double calc_ω(const double i, const double Ω, const double l, const double l1, const double l2, const double l3) {
	if (cos(i) != 0)
		return (atan2(sin((-l1 * sin(Ω) + l2 * cos(Ω)) / (l * cos(i))), cos((l1 * cos(Ω) + l2 * sin(Ω)) / (l))));
	else
		return atan2(sin(l3 / l), cos(l2 / (l * sin(Ω))));
}

double calc_u(const double x, const double y, const double z, const double i, const double Ω, const double r) {
	return (atan2((z) / (r * sin(i)), ((x / r) * cos(Ω) + y / r * sin(Ω))));
}

double calc_N(const double u, const double ω) {
	return (atan2((sin(u) * cos(ω) - cos(u) * sin(ω)), (cos(u) * cos(ω) + sin(u) * sin(ω))));
}

int calc_component_V(double p, double e, double N, double& Vr, double& Vτ, const double& gpE) {
	Vr = sqrt(gpE / p) * e * sin(N);
	Vτ = sqrt(gpE / p) * (1 + e * cos(N));
	return 0;
}

double calc_θ(const double Vr, const double Vτ, const double V) {
	return (atan2(Vr / V, Vτ / V));
}

double calculate_E(const double M, const double e) {
	double buffer_Ek{ M };
	double buffer_Ek1{ 0 };
	for (short i = 0; i < 4; i++) {
		buffer_Ek1 = M + e * sin(buffer_Ek);
		buffer_Ek = buffer_Ek1;
	}
	return buffer_Ek1;
}

int calculeteKeplerToCoord(Matrix& DCS, const double r, const double u, const double Ω, const double i) {
	DCS(0, 0) = r * (cos(u) * cos(Ω) - sin(u) * sin(Ω) * cos(i));
	DCS(1, 0) = r * (cos(u) * sin(Ω) + sin(u) * cos(Ω) * cos(i));
	DCS(2, 0) = r * sin(u) * sin(i);
	return 1;
}

int calculateKeplerToSpeed(Matrix& DVS, const Matrix& DCS, const double r, const double u, const double Ω, const double i, const double V_r, const double V_τ) {

	DVS(0, 0) = DCS(0, 0) / r * V_r + (-sin(u) * cos(Ω) - cos(u) * sin(Ω) * cos(i)) * V_τ;
	DVS(1, 0) = DCS(1, 0) / r * V_r + (-sin(u) * sin(Ω) - cos(u) * cos(Ω) * cos(i)) * V_τ;
	DVS(2, 0) = DCS(2, 0) / r * V_r + cos(u) * sin(i) * V_τ;