#pragma once





#include "LogInfoCls.h"
#include "BaseConstVariable.h"
#include "GeoOperator.h"
#include <QString>
#include <vector>
#include <memory>

/// <summary>
/// 多项式轨道模型
/// </summary>
class GF3PolyfitSatelliteOribtModel  
{
public:
	GF3PolyfitSatelliteOribtModel();
	~GF3PolyfitSatelliteOribtModel() ;
public:
	QString getSatelliteOribtModelParamsString();

public: // 卫星轨道节点
	virtual SatelliteOribtNode getSatelliteOribtNode(double& timeFromStartTime, bool& antAzAngleFlag) ; // 获取轨道节点
	virtual ErrorCode getSatelliteOribtNode(double& timeFromStartTime, SatelliteOribtNode& node, bool& antAzAngleFlag) ; // 获取轨道节点
	virtual ErrorCode getSatelliteAntDirectNormal(SatelliteOribtNode& Rs, Vector3D& Rt, SatelliteAntDirect& antNode); // 计算目标在天线方向图中的位置
public: // 卫星轨道模型的参考时间节点
	virtual void setSatelliteOribtStartTime(long double oribtStartTime) ;// 设置卫星模型参考时间
	virtual long double  getSatelliteOribtStartTime() ;// 获取卫星模型参考时间
public: // 入射角相关参数
	virtual void setbeamAngle(double beamAngle, bool RightLook) ;// 设置波位角

public: // 天线摆动角相关参数
	virtual void setAzAngleRange(double cycletime, double minAzAngle, double maxAzAngle, double referenceAzAngle, double referenceTimeFromStartTime) ;//方位角变换循环时间 ;方位角变换范围； 特定时间的方位角，用于计算方位角变化情况

	virtual double getAzAngleInCurrentTimeFromStartTime(double& currentTime) ;// 获取当前时间的 天线摆动角
	virtual ErrorCode getAzAngleInCurrentTimeFromStartTime(double& currentTime, double& AzAngle);// 获取当前时间的 天线摆动角

public: // 定义在原始天线坐标下的天线坐标系的调整，其中仍然定义-Z 轴为 天线指向方向
	virtual void setAntnnaAxisX(double X, double Y, double Z) ; // 设置天线X轴指向
	virtual void setAntnnaAxisY(double X, double Y, double Z) ; // 设置天线X轴指向
	virtual void setAntnnaAxisZ(double X, double Y, double Z) ; // 设置天线X轴指向

	virtual ErrorCode getAntnnaDirection(SatelliteOribtNode& node) ; // 获取天线指向方向
	virtual ErrorCode getZeroDopplerAntDirect(SatelliteOribtNode& node) ;
private: // 变量
	long double oribtStartTime; // 卫星模型参考时间
	double beamAngle; // 波位角
	bool RightLook; // 左右视
	double cycletime; // 方位角变换循环时间
	double minAzAngle; // 方位角变换范围
	double maxAzAngle; // 方位角变换范围
	double referenceAzAngle; // 特定时间的方位角，用于计算方位角变化情况
	double referenceTimeFromStartTime; // 特定时间的方位角，用于计算方位角变化情况

	Point3 AntnnaAxisX; // 天线X轴指向
	Point3 AntnnaAxisY; // 天线Y轴指向
	Point3 AntnnaAxisZ; // 天线Z轴指向


public: // 增加节点
	void addOribtNode(SatelliteOribtNode node);
	ErrorCode polyFit(int polynum = 3, bool input_timeFromReferenceTime = false);


private: // 轨道节点
	std::vector<SatelliteOribtNode> oribtNodes;

	std::vector<double> polyfitPx; // 空间坐标
	std::vector<double> polyfitPy;
	std::vector<double> polyfitPz;
	std::vector<double> polyfitVx; // 速度拟合参数
	std::vector<double> polyfitVy;
	std::vector<double> polyfitVz;

	double Pxchisq; // 拟合误差 X2
	double Pychisq;
	double Pzchisq;
	double Vxchisq;
	double Vychisq;
	double Vzchisq;

public:
	virtual double getPt() ;
	virtual double getGri() ;
	virtual void setPt(double Pt) ;
	virtual void setGri(double gri) ;

	//virtual double getPt();
	//virtual double getGri();
	//virtual void setPt(double Pt);
	//virtual void setGri(double gri);



private:
	double Pt; // 发射电压
	double Gri;// 系统增益

};

std::shared_ptr<GF3PolyfitSatelliteOribtModel>   CreataGF3PolyfitSatelliteOribtModel(std::vector<SatelliteOribtNode>& nodes, long double startTime, int polynum = 3);




