RasterProcessTool/Toolbox/SimulationSARTool/PowerSimulationIncoherent/OribtModelOperator.h

101 lines
3.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef ORIBTMODELOPERATOR_H_
#define ORIBTMODELOPERATOR_H_
#include <QFile>
#include <QDomDocument>
#include <QVector3D>
#include <QDebug>
#include <QList>
#include <Eigen/Core>
#include <Eigen/Dense>
#include "BaseConstVariable.h"
QList<SatellitePos> loadNodesFromXml(const QString& filename);
void saveNodesToXml(const QString& filename, const QList<SatellitePos>& inposes);
class OrbitModelAbstract {
public:
OrbitModelAbstract();
~OrbitModelAbstract();
public:
virtual SatellitePos predictNode(double time) ;
};
class OrbitElements {
public:
double semiMajorAxis; // 半长轴 (a)
double eccentricity; // 离心率 (e)
double inclination; // 倾斜角 (i)
double longitudeOfAscendingNode; // 升交点赤经 (Ω)
double argumentOfPeriapsis; // 近地点幅角 (ω)
double trueAnomaly; // 真近点角 (ν)
OrbitElements();
};
class OrbitEstimator :public OrbitModelAbstract {
public:
OrbitEstimator();
void estimateOrbit(const SatellitePos& node);
void saveToXml(const QString& filename) const;
bool loadFromXml(const QString& filename);
SatellitePos calculateNode(double time) const;
virtual SatellitePos predictNode(double time) override;
private:
OrbitElements elements;
OrbitElements estimateKeplerianElements(const SatellitePos& node);
SatellitePos calculateKeplerianNode(const OrbitElements& elements, double time) const;
double solveKeplerEquation(double M, double e) const;
};
class PolynomialOrbitModel :public OrbitModelAbstract {
public:
void fitPolynomial(const QList<SatellitePos>& nodes, int degree=3);
SatellitePos predictPosition(double time);
void saveToXml(const QString& filename) const;
bool loadFromXml(const QString& filename);
virtual SatellitePos predictNode(double time) override;
private:
Eigen::VectorXd coefficientsX;
Eigen::VectorXd coefficientsY;
Eigen::VectorXd coefficientsZ;
Eigen::VectorXd coefficientsVx;
Eigen::VectorXd coefficientsVy;
Eigen::VectorXd coefficientsVz;
Eigen::VectorXd leastSquaresFit(const QList<double>& x, const QList<double>& y, int degree);
void saveCoefficientsToXml(QDomElement& parent, const Eigen::VectorXd& coefficients, const QString& tagName) const;
bool loadCoefficientsFromXml(const QDomElement& parent, Eigen::VectorXd& coefficients, const QString& tagName);
};
class TwoLineElements :public OrbitModelAbstract {
public:
TwoLineElements();
bool loadFromTleFile(const QString& filename);
SatellitePos calculateNode(double time) const;
virtual SatellitePos predictNode(double time) override;
private:
std::string line1;
std::string line2;
void parseTleLines();
double meanMotion() const;
double semiMajorAxis() const;
double eccentricity() const;
double inclination() const;
double longitudeOfAscendingNode() const;
double argumentOfPeriapsis() const;
double meanAnomaly() const;
double revolutionNumberAtEpoch() const;
double epochTime() const;
double solveKeplerEquation(double M, double e) const;
SatellitePos calculateKeplerianNode(double time) const;
};
#endif