📄 orbitparamdlg.cpp
字号:
// OrbitParamDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SatelliteOrbitCalculationPro.h"
#include "OrbitParamDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COrbitParamDlg dialog
COrbitParamDlg::COrbitParamDlg(CWnd* pParent /*=NULL*/)
: CDialog(COrbitParamDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(COrbitParamDlg)
m_I = 0.0;
m_A = 0.0;
m_E = 0.0;
m_R = 0.0;
m_W = 0.0;
m_O = 0.0;
m_M = 0.0;
m_PRNID = 0;
m_Time = 0;
m_RESULT_EP = 0.0;
m_RESULT_AP = 0.0;
//}}AFX_DATA_INIT
}
void COrbitParamDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COrbitParamDlg)
DDX_Text(pDX, IDC_EDIT3, m_I);
DDX_Text(pDX, IDC_EDIT4, m_A);
DDX_Text(pDX, IDC_EDIT5, m_E);
DDX_Text(pDX, IDC_EDIT6, m_R);
DDX_Text(pDX, IDC_EDIT7, m_W);
DDX_Text(pDX, IDC_EDIT8, m_O);
DDX_Text(pDX, IDC_EDIT9, m_M);
DDX_Text(pDX, IDC_EDIT1, m_PRNID);
DDX_Text(pDX, IDC_EDIT2, m_Time);
DDX_Text(pDX, IDC_EDIT10, m_RESULT_EP);
DDX_Text(pDX, IDC_EDIT11, m_RESULT_AP);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COrbitParamDlg, CDialog)
//{{AFX_MSG_MAP(COrbitParamDlg)
ON_BN_CLICKED(IDC_SHOW_ORBIT, OnShowOrbit)
ON_BN_CLICKED(IDC_SHOW_PHOTO, OnShowPhoto)
ON_BN_CLICKED(IDC_SHOW_RESULT, OnShowResult)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COrbitParamDlg message handlers
void COrbitParamDlg::Skip_Line(int LineNum)
{
rewind(pFile);
while(LineNum)
{
if(fgetc(pFile) == '\n')
{
--LineNum;
}
}
}
//////////////////////////////////////////////////////////////////////////
//显示卫星的轨道参数
void COrbitParamDlg::OnShowOrbit()
{
// TODO: Add your control notification handler code here
char _ch_Param_Temp[20];
pFile = fopen("OrbitParameter.txt", "r+");
if (NULL == pFile)
{
MessageBox("指定的文件没有响应");
}
memset(_ch_Param_Temp, 0, 20);
rewind(pFile);
UpdateData();
int _Temp_PRNID;
_Temp_PRNID = m_PRNID;
CString _Temp_str;
if ( m_Time <0 || m_Time > 86400 )
{
MessageBox("请将时间范围限定在[0,86400]之内");
}
else
{
if (m_PRNID > 31 || m_PRNID <1)
{
m_I = 0.0;
m_A = 0.0;
m_E = 0.0;
m_R = 0.0;
m_W = 0.0;
m_O = 0.0;
m_M = 0.0;
m_PRNID = 0;
// m_Time = 0;
m_RESULT_EP = 0.0;
m_RESULT_AP = 0.0;
MessageBox("请选择PRN号范围为[1,31]的卫星");
}
else
{
if (0 == m_PRNID)
{
m_I = 0.0;
m_A = 0.0;
m_E = 0.0;
m_R = 0.0;
m_W = 0.0;
m_O = 0.0;
m_M = 0.0;
m_PRNID = 0;
// m_Time = 0;
m_RESULT_EP = 0.0;
m_RESULT_AP = 0.0;
MessageBox("请输入卫星的PRN号");
}
else
{
if (2 == m_PRNID || 12 == m_PRNID)
{
m_I = 0.0;
m_A = 0.0;
m_E = 0.0;
m_R = 0.0;
m_W = 0.0;
m_O = 0.0;
m_M = 0.0;
m_PRNID = 0;
// m_Time = 0;
m_RESULT_EP = 0.0;
m_RESULT_AP = 0.0;
MessageBox("无此PRN号的卫星,请重新输入");
}
else
{
Skip_Line( _Temp_PRNID );
fseek(pFile, 8, SEEK_CUR);
fscanf(pFile, "%14s", _ch_Param_Temp);
m_E = atof( _ch_Param_Temp );
fseek(pFile, 2, SEEK_CUR);
fscanf(pFile, "%11s", _ch_Param_Temp);
m_A = atof( _ch_Param_Temp );
fseek(pFile, 2, SEEK_CUR);
fscanf(pFile, "%12s", _ch_Param_Temp);
m_W = atof( _ch_Param_Temp );
fseek(pFile, 2, SEEK_CUR);
fscanf(pFile, "%13s", _ch_Param_Temp);
m_M = atof( _ch_Param_Temp );
fseek(pFile, 2, SEEK_CUR);
fscanf(pFile, "%12s", _ch_Param_Temp);
m_I = atof( _ch_Param_Temp );
fseek(pFile, 2, SEEK_CUR);
fscanf(pFile, "%13s", _ch_Param_Temp);
m_O = atof( _ch_Param_Temp );
fseek(pFile, 2, SEEK_CUR);
fscanf(pFile, "%16s", _ch_Param_Temp);
m_R = atof( _ch_Param_Temp );
}
}
}
}
UpdateData( FALSE );
fclose( pFile );
}
//////////////////////////////////////////////////////////////////////////
//显示图像函数
void COrbitParamDlg::OnShowPhoto()
{
// TODO: Add your control notification handler code here
}
//////////////////////////////////////////////////////////////////////////
//显示计算结果
void COrbitParamDlg::OnShowResult()
{
// TODO: Add your control notification handler code here
UpdateData();
double _Temp_Init_X, _Temp_Init_Y, _Temp_Init_Z;
double _Temp_X1, _Temp_Y1, _Temp_Z1;
double _Temp_X2, _Temp_Y2, _Temp_Z2;
double _Temp_X3, _Temp_Y3, _Temp_Z3;
double _Temp_Terminal_X, _Temp_Terminal_Y, _Temp_Terminal_Z;
double _Temp_B; //椭圆短轴
double _Temp_n0;
double _Temp_m0;
double _Temp_E1;
double _Temp_o0;
double _Temp_C;
int _Temp_Counter;
_Temp_B = sqrt((1 - m_E * m_E)) * m_A * m_A;
_Temp_n0 = 19964982 / (m_A * m_A * m_A);
_Temp_m0 = m_M + _Temp_n0 * m_Time;
_Temp_E1 = _Temp_m0;
for(_Temp_Counter = 100; _Temp_Counter >0; _Temp_Counter--)
{
_Temp_E1 = _Temp_m0 + m_E * sin(_Temp_E1);
}
if (0 == m_A)
{
MessageBox("请点击“显示轨道参数”按钮");
}
else
{
_Temp_Init_X = m_A * m_A * (cos(_Temp_E1) - m_E) * (cos(m_W) * cos(m_O) - sin(m_W) * sin(m_O) * cos(m_I)) - _Temp_B * sin(_Temp_E1) * (sin(m_W) * cos(m_O) + cos(m_W) * sin(m_O) * cos(m_I));
_Temp_Init_Y = m_A * m_A * (cos(_Temp_E1) - m_E) * (sin(m_W) * sin(m_O) - sin(m_W) * cos(m_O) * cos(m_I)) - _Temp_B * sin(_Temp_E1) * (sin(m_W) * sin(m_O) - cos(m_W) * cos(m_O) * cos(m_I));
_Temp_Init_Z = m_A * m_A * (cos(_Temp_E1) - m_E) * sin(m_W) * sin(m_I) - _Temp_B * sin(_Temp_E1) * cos(m_W) * sin(m_I);
_Temp_o0 = m_O + (m_R - 0.0000729211567) * m_Time;
_Temp_X1 = _Temp_Init_X * cos(_Temp_o0) - _Temp_Init_Y * cos(m_I) * sin(_Temp_o0);
_Temp_Y1 = _Temp_Init_X * sin(_Temp_o0) + _Temp_Init_Y * cos(m_I) * cos(_Temp_o0);
_Temp_Z1 = _Temp_Init_Y * sin(m_I);
_Temp_X2 = (6378137 + 40) * cos(1.9939) * cos(0.53205);
_Temp_Y2 = (6378137 + 40) * cos(1.9939) * sin(0.53205);
_Temp_Z2 = (6378137 * (1 - 0.00669437999013) + 40) * sin(1.9939);
_Temp_X3 = _Temp_X1 - _Temp_X2;
_Temp_Y3 = _Temp_Y1 - _Temp_Y2;
_Temp_Z3 = _Temp_Z1 - _Temp_Z2;
_Temp_Terminal_X = -sin(0.53205) * cos(1.9939) * _Temp_X3 - sin(0.53205) * sin(1.9939) * _Temp_Y3 + cos(0.53205) * _Temp_Z3;
_Temp_Terminal_Y = -sin(1.9939) * _Temp_X3 + cos(1.9939) * _Temp_Y3;
_Temp_Terminal_Z = cos(0.53205) * cos(1.9939) * _Temp_X3 + cos(0.53205) * sin(1.9939) * _Temp_Y3 + sin(0.53205) * _Temp_Z3;
m_RESULT_EP = atan(_Temp_Terminal_X/_Temp_Terminal_Y);
if (_Temp_Terminal_X < 0)
{
m_RESULT_EP = m_RESULT_EP/PI *180 + 180;
}
else
{
m_RESULT_EP = m_RESULT_EP/PI *180;
}
_Temp_C = _Temp_Terminal_Z / sqrt(_Temp_Terminal_X * _Temp_Terminal_X + _Temp_Terminal_Y * _Temp_Terminal_Y);
m_RESULT_AP = atan(_Temp_C);
m_RESULT_AP = m_RESULT_AP/PI *180;
}
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -