⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 二体问题dlg.cpp

📁 计算大地中的二体问题
💻 CPP
字号:
// 二体问题Dlg.cpp : implementation file
//

#include "stdafx.h"

#include "二体问题.h"
#include "二体问题Dlg.h"
#include<iostream.h>
#include<math.h>
//const  double k=3.1415926;
#define k (atan(1)*4)


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg)
	m_zi = 30.0;
	m_za =9599999.8880;
	m_ze = 0.01;
	m_zw = 50.0;
	m_z = 100.0;
	m_zM = 138.448104;
	m_vx = 0.0;
	m_vy = 0.0;
	m_vz = 0.0;
	m_rx = 0.0;
	m_ry = 0.0;
	m_rz = 0.0;
	m_fi = 0.0;
	m_f = 0.0;
	m_fa = 0.0;
	m_fe = 0.0;
	m_fw = 0.0;
	m_fT = 0.0;
	m_t = 9.0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);



}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
	DDX_Text(pDX, IDC_EDIT1, m_zi);
	DDX_Text(pDX, IDC_EDIT2, m_za);
	DDX_Text(pDX, IDC_EDIT3, m_ze);
	DDX_Text(pDX, IDC_EDIT4, m_zw);
	DDX_Text(pDX, IDC_EDIT5, m_z);
	DDX_Text(pDX, IDC_EDIT7, m_zM);
	DDX_Text(pDX, IDC_EDIT8, m_vx);
	DDX_Text(pDX, IDC_EDIT9, m_vy);
	DDX_Text(pDX, IDC_EDIT10, m_vz);
	DDX_Text(pDX, IDC_EDIT11, m_rx);
	DDX_Text(pDX, IDC_EDIT12, m_ry);
	DDX_Text(pDX, IDC_EDIT13, m_rz);
	DDX_Text(pDX, IDC_EDIT14, m_fi);
	DDX_Text(pDX, IDC_EDIT18, m_f);
	DDX_Text(pDX, IDC_EDIT15, m_fa);
	DDX_Text(pDX, IDC_EDIT16, m_fe);
	DDX_Text(pDX, IDC_EDIT17, m_fw);
	DDX_Text(pDX, IDC_EDIT19, m_fT);
	DDX_Text(pDX, IDC_EDIT6, m_t);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	//{{AFX_MSG_MAP(CMyDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control

}

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMyDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;}


///////////////////////正算/////////////////////////////////
void CMyDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here

     UpdateData();
	 long double w1=m_zw;
	 long double M0=m_zM;
	 long double i1=m_zi;
	 long double u=3.986005e14;	
	 long double a=m_za;
	 long double e=m_ze;
	 long double o1=m_z;
	 long double t=m_t*3600;
	 long double o=(o1/180.0)*k;
     long double n=sqrt(u/(a*a*a));
	 long double w=(w1/180.0)*k;
	 long double i=(i1/180.0)*k;
	 long double M1=(M0/180.0)*k;
	 long double M=n*t-M1;
	 long double E=M;
	 long double qx,qy,qz;
	 long double px,py,pz;
  ///////////////////////迭代/////////////////////
	  do
	  {
           E=M+e*sin(E);
	  }while(fabs(M+e*sin(E)-E)>1e-10);
	 

	  
	px=cos(w)*cos(o)-sin(w)*sin(o)*cos(i);
	py=cos(w)*sin(o)+sin(w)*cos(o)*cos(i);
	pz=sin(w)*sin(i);
    
	qx=-sin(w)*cos(o)-cos(w)*sin(o)*cos(i);
	qy=-sin(w)*sin(o)+cos(w)*cos(o)*cos(i);
	qz=cos(w)*sin(i);
		   
	  long double rx=a*(cos(E)-e)*px+a*sqrt(1-e*e)*sin(E)*qx;
	  long double ry=a*(cos(E)-e)*py+a*sqrt(1-e*e)*sin(E)*qy;
	  long double rz=a*(cos(E)-e)*pz+a*sqrt(1-e*e)*sin(E)*qz;
      
	  long double vx=(sqrt(u/a)/(1-e*cos(E)))*(-sin(E)*px+sqrt(1-e*e)*cos(E)*qx);
      long	double vy=(sqrt(u/a)/(1-e*cos(E)))*(-sin(E)*py+sqrt(1-e*e)*cos(E)*qy);
      long	double vz=(sqrt(u/a)/(1-e*cos(E)))*(-sin(E)*pz+sqrt(1-e*e)*cos(E)*qz);
   	  long double v=sqrt(vx*vx+vy*vy+vz*vz);
   	  long double r=sqrt(rx*rx+ry*ry+rz*rz);
        
		m_rx=rx;
		m_ry=ry;
		m_rz=rz;

	    m_vx=vx;
		m_vy=vy;
		m_vz=vz;
	    UpdateData(FALSE);
		enum w{ SIZE1 = 100, SIZE2 = 200}; // 枚举常量
		int kkkk[100]={0};

}


/////////////////////////////////////反算///////////////////
void CMyDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	 UpdateData(TRUE);


	long double rx=m_rx;
    long double ry=m_ry;
    long double rz=m_rz;
    long double vx=m_vx;
    long double vy=m_vy;
    long double vz=m_vz;	
	long double a,X,Y;
    long double r=sqrt(rx*rx+ry*ry+rz*rz);
    long double v=sqrt(vx*vx+vy*vy+vz*vz);
    long double u=398600500000000;
    long double e;
    long double A;
    long double B;
    long double C;
    long double T;
    long double o,Q;
    long double n;
    long double M;
    long double t=m_t*3600;
    long double f;
    long double E;
    long double w,W;
    long double i,I;


	a=1.0/(2.0/r-v*v/u); 
    X=1-r/a;
	Y=(vx*rx+vy*ry+vz*rz)/sqrt(u*a);
    e=sqrt(X*X+Y*Y); 
	E=atan(Y/X);
	M=E-Y;
	A=ry*vz-rz*vy;
	B=rz*vx-rx*vz;
	C=rx*vy-ry*vx;
	i=acos(C/sqrt(A*A+B*B+C*C));
	o=atan(-A/B);
	n=sqrt(u/(a*a*a));
	T=n*t-M;
	while (T > 2 * k)
		T -= 2 * k;
	T *= 180 / k;
	f=acos((cos(E)-e)/(1-e*cos(E)));
	w=atan(rz/sin(i)/((-1)*rx*cos(o)-ry*sin(o)))-f;

	I=(i*180.0)/k;
	Q=(o*180.0)/k+180;
    W=(w*180.0)/k;


    	m_fa=a;
		m_fe=e;
		m_fi=I;
		m_f=Q;
		m_fT=T;
		m_fw=W;
	
	UpdateData(FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -