Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
06.05.2013
Размер:
22.64 Кб
Скачать
#include <windows.h>
#include "resource.h"
#include <stdio.h>
#include <math.h>
//=Переменные и функции окон и диалогов========================
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
DWORD WINAPI ThreadProc (LPVOID lpParameter);
BOOL CALLBACK DialogPlanet(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam);
BOOL CALLBACK DialogRocket(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam);
BOOL CALLBACK DialogOut(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam);
char szWinName[] = "Мое Окно";
HWND hwnd;
HDC memdc;
PAINTSTRUCT paintstruct;
HINSTANCE ThisInst;	
//=Начальные условия============================================  
double S_planet_mass, S_planet_radius, Spmm, Spmp,
S_rocket_um, S_rocket_fm, S_rocket_fv, S_rocket_fu, S_rocket_alim;
int Out;
//=Переменные и фунции моделирования ===========================
double h,R,
	   v,c,v2k,	
	   a,g,
	   M,m,dmpodt,
	   maxt,t,dt,
	   G,res;
void set_dmpodt();
double dV(double argt, double argx);
//=Графические преобразования=================================== 
int x_to_Gx(double arg);
int y_to_Gy(double arg);
double max_a_x, max_a_y, min_a_x, min_a_y;
double max_g_x, max_g_y, min_g_x, min_g_y;
void Set_CS_A();
void Set_CS_V();
void Set_CS_H();
void Set_CS_DMPODT();
double limA, limV, limH, limT, limDMPODT;
//=Параметры планет=============================================  
double m_radius[10];
double m_mass[10][2];
void InitPlanets();
//=Анимация ракеты==============================================  
//void status(int param);
//==============================================================
int Set_A_coords_plus_first_count();
void Model();
//==============================================================
int WINAPI WinMain (HINSTANCE hThisInst, 
  					  HINSTANCE hPrevInst,
  					  LPSTR lpszArgs,
  					  int nWinMode)
  {
  	
  	MSG msg;
  	WNDCLASS wcl;
  	wcl.hInstance=hThisInst;
  	wcl.lpszClassName=szWinName; 
  	wcl.lpfnWndProc=WindowFunc; 
  	wcl.style=0;                
  	wcl.hIcon=LoadIcon(hThisInst ,MAKEINTRESOURCE(ID_KSICON3)); 
    wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
    wcl.lpszMenuName= (LPSTR)ID_MENU_1; 
    wcl.cbClsExtra=0;
    wcl.cbWndExtra=0;
    wcl.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);
    
	if (!RegisterClass (&wcl)) return 0;
    
    hwnd = CreateWindow(szWinName,"Реактивное движение [2.4]",
    	   WS_OVERLAPPEDWINDOW,
	  	   50, // LEFT_UP_X
	  	   50, // LEFT_UP_Y	
	  	   700,// WIDE_X	
	  	   530,// WIDE_Y 
	  	   HWND_DESKTOP,
	  	   NULL,
	  	   hThisInst,
	  	   NULL);

	// Показать окно и нарисовать содержимое
	
	ShowWindow(hwnd,nWinMode);
	UpdateWindow (hwnd);
	// Цикл обработки сообщений
	while (GetMessage (&msg, NULL, 0, 0))
	{
		TranslateMessage (&msg);
		DispatchMessage (&msg);
		
	}

	DeleteDC (memdc);
	return msg.wParam;
  }	                  
//==============================================================  
 LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,
  							WPARAM wParam,LPARAM lParam)
  {
  	HDC hdc;
  	HBITMAP hbit;
  	HBRUSH hbrush;
    
	DWORD Tid;
	static HANDLE hct;
	
	static int maxX, maxY;  	
   	switch (message)
  	{
  		  					     
  		case WM_CREATE:
  		    maxX = GetSystemMetrics (SM_CXSCREEN);
  		    maxY = GetSystemMetrics (SM_CYSCREEN);
  			hdc = GetDC(hwnd);
  			memdc = CreateCompatibleDC(hdc);
  			hbit = CreateCompatibleBitmap (hdc,maxX,maxY);
  			SelectObject (memdc, hbit);
  			hbrush = GetStockObject (LTGRAY_BRUSH);
  			SelectObject (memdc, hbrush);	
			PatBlt (memdc, 0,0, maxX,maxY,PATCOPY);
  			ReleaseDC (hwnd, hdc);       
			SelectObject (memdc, GetStockObject (WHITE_BRUSH));	
			SelectObject (memdc, CreatePen(PS_SOLID,1,RGB(0,0,0)));
			Rectangle(memdc, 25,250,225,450);
			Rectangle(memdc,250,250,450,450);
			Rectangle(memdc,475,250,675,450);
			Rectangle(memdc,25, 50,225,175);
			SelectObject (memdc, GetStockObject (BLACK_BRUSH));	
			Rectangle(memdc,250, 50,650,200);
			SetTextColor(memdc, RGB(0, 0, 0));
			SetBkColor(memdc, RGB(191, 191, 191));
			TextOut(memdc,25,455,"Высота",6);
			TextOut(memdc,250,455,"Скорость",8);
			TextOut(memdc,475,455,"Ускорение",9);
			TextOut(memdc,25,175,"Расход топлива",14);
			SetTextColor(memdc, RGB(255,255,255));
			SetBkColor(memdc, RGB(0, 0, 0));
			TextOut(memdc,250,50,"Ожидается установка параметров...",33);
			InvalidateRect(hwnd,NULL,TRUE);
			UpdateWindow(hwnd);
			InitPlanets();
			S_planet_radius=m_radius[2];
			Spmm=m_mass[2][0]; Spmp=m_mass[2][1];
			S_planet_mass=Spmm*pow(10,Spmp);	
			S_rocket_um=5; S_rocket_fm=100; S_rocket_fv=4; S_rocket_fu=1.2;
			S_rocket_alim=50;
			Out=1;
			EnableMenuItem(GetMenu(hwnd),ID_GOON,MF_GRAYED);
			EnableMenuItem(GetMenu(hwnd),ID_PAUSE,MF_GRAYED);
			break;
  		
	  		case WM_PAINT:
  			hdc = BeginPaint(hwnd,&paintstruct);
			BitBlt (hdc, 0, 0, maxX,maxY, memdc,0,0,SRCCOPY);	
			EndPaint(hwnd,&paintstruct);
			break;
  		
		case WM_COMMAND:
  			switch (LOWORD(wParam))
  			{
  				
				case ID_HLP:
  					WinHelp(hwnd,"02react.hlp",HELP_FINDER,NULL);
					break;			
			
				case ID_VERS:
  					MessageBox(hwnd, "Программа написана в целях получения зачета по компьютерным методам в физике.\n\n Автор - Пяткин Ю.К., 214 группа.\n\nМГУ им. М.В. Ломоносова, физический факультет.\n\n2003 г.",
  					"Реактивное движение [2.4]",MB_OK | MB_ICONINFORMATION);
  					break;

				case ID_ROCKET:
					DialogBox(ThisInst, MAKEINTRESOURCE(ID_D_ROCKET),hwnd, DialogRocket);
					break;
								
				case ID_PLANET:
					DialogBox(ThisInst, MAKEINTRESOURCE(ID_D_PLANET),hwnd, DialogPlanet);
					break;
				
				case ID_OUT:
					DialogBox(ThisInst, MAKEINTRESOURCE(ID_D_OUT),hwnd, DialogOut);
					break;
					
				case ID_PAUSE:
					SuspendThread(hct);
					EnableMenuItem(GetMenu(hwnd),ID_GOON,MF_ENABLED);
					EnableMenuItem(GetMenu(hwnd),ID_PAUSE,MF_GRAYED);
					break;
				
				case ID_GOON:
					ResumeThread(hct);
					EnableMenuItem(GetMenu(hwnd),ID_GOON,MF_GRAYED);
					EnableMenuItem(GetMenu(hwnd),ID_PAUSE,MF_ENABLED);
					break;

				case ID_GO:
					SetTextColor(memdc, RGB(255,255,255));
					SetBkColor(memdc, RGB(0, 0, 0));
					TextOut(memdc,250,70,"Идет предварительный рассчет...",31);
					InvalidateRect(hwnd,NULL,TRUE);
					UpdateWindow(hwnd);
					EnableMenuItem(GetMenu(hwnd),ID_PAUSE,MF_ENABLED);
					EnableMenuItem(GetMenu(hwnd),ID_PLANET,MF_GRAYED);
					EnableMenuItem(GetMenu(hwnd),ID_ROCKET,MF_GRAYED);
					EnableMenuItem(GetMenu(hwnd),ID_OUT,MF_GRAYED);

					if (Set_A_coords_plus_first_count()==1)
						TextOut(memdc,250,90,"Предварительный рассчет завершен.",33);
					if (Set_A_coords_plus_first_count()==2)
						TextOut(memdc,250,90,"Ракета не может оторваться от планеты!",38);
					InvalidateRect(hwnd,NULL,TRUE);
					UpdateWindow(hwnd);
					if (Set_A_coords_plus_first_count()<2)
						{
						if (MessageBox(hwnd, "Произвести моделирование?","Запрос.",MB_YESNO | MB_ICONQUESTION) == IDYES)
							{
							hct = CreateThread(NULL,0,ThreadProc,NULL,0,&Tid);
							}
						}
					EnableMenuItem(GetMenu(hwnd),ID_GO,MF_GRAYED);
					break;

				case ID_RELOAD:
					EnableMenuItem(GetMenu(hwnd),ID_GO,MF_ENABLED);
					EnableMenuItem(GetMenu(hwnd),ID_GOON,MF_GRAYED);
					EnableMenuItem(GetMenu(hwnd),ID_PAUSE,MF_GRAYED);
					EnableMenuItem(GetMenu(hwnd),ID_PLANET,MF_ENABLED);
					EnableMenuItem(GetMenu(hwnd),ID_ROCKET,MF_ENABLED);
					EnableMenuItem(GetMenu(hwnd),ID_OUT,MF_ENABLED);

					SelectObject (memdc, GetStockObject (LTGRAY_BRUSH));	
					Rectangle(memdc, -100,-100,1000,1000);					
					SelectObject (memdc, GetStockObject (WHITE_BRUSH));	
					SelectObject (memdc, CreatePen(PS_SOLID,1,RGB(0,0,0)));
					Rectangle(memdc, 25,250,225,450);
					Rectangle(memdc,250,250,450,450);
					Rectangle(memdc,475,250,675,450);
					Rectangle(memdc,25, 50,225,175);
					SelectObject (memdc, GetStockObject (BLACK_BRUSH));	
					Rectangle(memdc,250, 50,650,200);
					SetTextColor(memdc, RGB(0, 0, 0));
					SetBkColor(memdc, RGB(191, 191, 191));
					TextOut(memdc,25,455,"Высота",6);
					TextOut(memdc,250,455,"Скорость",8);
					TextOut(memdc,475,455,"Ускорение",9);
					TextOut(memdc,25,175,"Расход топлива",14);
					SetTextColor(memdc, RGB(255,255,255));
					SetBkColor(memdc, RGB(0, 0, 0));
					TextOut(memdc,250,50,"Ожидается установка параметров...",33);
					TerminateThread(hct,0);
					InvalidateRect(hwnd,NULL,TRUE);
					UpdateWindow(hwnd);
					break;

				case ID_EX:
  				    if (MessageBox(hwnd, "Вы действительно хотите выйти?",
  					"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
  				    	DestroyWindow(hwnd);
 					break;
  			}  
  			break;
  		            		
  		case WM_HELP:
            WinHelp(hwnd,"02react.hlp",HELP_FINDER,NULL);
			break;
			
		case WM_DESTROY:
			PostQuitMessage(0);
  			break;
  		
  		default:
  			return DefWindowProc (hwnd, message, wParam, lParam);
  	}
  	return 0;
  }							
//==============================================================  	
BOOL CALLBACK DialogRocket(HWND hDlg,UINT uMsg, WPARAM wParam,LPARAM lParam)
{
	char str[80];
	switch (uMsg)
		{
		case (WM_INITDIALOG):
		sprintf (str,"%1.4lf",S_rocket_um);
		SetDlgItemText(hDlg,IDC_EDIT_UM,str);
		sprintf (str,"%1.4lf",S_rocket_fm);
		SetDlgItemText(hDlg,IDC_EDIT_FM,str);
		sprintf (str,"%1.4lf",S_rocket_fv);
		SetDlgItemText(hDlg,IDC_EDIT_FV,str);
		sprintf (str,"%1.4lf",S_rocket_fu);
		SetDlgItemText(hDlg,IDC_EDIT_FU,str);
		sprintf (str,"%1.4lf",S_rocket_alim);
		SetDlgItemText(hDlg,IDC_EDIT_ALIM,str);
		return TRUE;

	case WM_COMMAND:
		switch (LOWORD (wParam))
		{
		case ID2_OK:		  		  
			GetDlgItemText(hDlg,IDC_EDIT_UM,str,80);
			S_rocket_um = atof(str);
			GetDlgItemText(hDlg,IDC_EDIT_FM,str,80);
			S_rocket_fm = atof(str);			
			GetDlgItemText(hDlg,IDC_EDIT_FV,str,80);
			S_rocket_fv = atof(str);
			GetDlgItemText(hDlg,IDC_EDIT_FU,str,80);
			S_rocket_fu = atof(str);
			GetDlgItemText(hDlg,IDC_EDIT_ALIM,str,80);
			S_rocket_alim = atof(str);
			EndDialog(hDlg, TRUE);
		return TRUE;

		case ID2_CANCEL:
			EndDialog(hDlg, TRUE);
			return TRUE;
		}
	}
	return FALSE;
}
//===================================================================
BOOL CALLBACK DialogOut(HWND hDlg,UINT uMsg, WPARAM wParam,LPARAM lParam)
{
	switch (uMsg)
		{
		case (WM_INITDIALOG):
		return TRUE;

	case WM_COMMAND:
		switch (LOWORD (wParam))
		{
		case ID3_YES:		  		  
			Out=1;
			EndDialog(hDlg, TRUE);
		return TRUE;

		case ID3_NO:
			Out=0;
			EndDialog(hDlg, TRUE);
			return TRUE;
		}
	}
	return FALSE;
}

//==============================================================  	
BOOL CALLBACK DialogPlanet(HWND hDlg,UINT uMsg, WPARAM wParam,LPARAM lParam)
{
	char str[80];
	switch (uMsg)
		{
		case (WM_INITDIALOG):
		sprintf (str,"%1.2lf",Spmm);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",Spmp);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",S_planet_radius);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		
		return TRUE;

	case WM_COMMAND:
		switch (LOWORD (wParam))
		{
		case ID1_MERC:
		sprintf (str,"%1.2lf",m_mass[0][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[0][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[0]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;

		case ID1_VEN:
		sprintf (str,"%1.2lf",m_mass[1][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[1][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[1]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_EARTH:
		sprintf (str,"%1.2lf",m_mass[2][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[2][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[2]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_LUNA:
		sprintf (str,"%1.2lf",m_mass[3][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[3][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[3]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_MARS:
		sprintf (str,"%1.2lf",m_mass[4][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[4][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[4]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_JUP:
		sprintf (str,"%1.2lf",m_mass[5][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[5][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[5]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_SUT:
		sprintf (str,"%1.2lf",m_mass[6][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[6][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[6]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_URAN:
		sprintf (str,"%1.2lf",m_mass[7][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[7][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[7]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_NEPT:
		sprintf (str,"%1.2lf",m_mass[8][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[8][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[8]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_PLUT:
		sprintf (str,"%1.2lf",m_mass[9][0]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_M,str);
		sprintf (str,"%2.0lf",m_mass[9][1]);
		SetDlgItemText(hDlg,IDC_EDIT_MP_P,str);
		sprintf (str,"%5.0lf",m_radius[9]);
		SetDlgItemText(hDlg,IDC_EDIT_RP,str);
		return TRUE;
		
		case ID1_OK:		  		  
			GetDlgItemText(hDlg,IDC_EDIT_MP_M,str,80);
			Spmm = atof(str);
			GetDlgItemText(hDlg,IDC_EDIT_MP_P,str,80);
			Spmp = atof(str);
			S_planet_mass=Spmm*pow(10,Spmp);			
			GetDlgItemText(hDlg,IDC_EDIT_RP,str,80);
			S_planet_radius=atof(str);			
			EndDialog(hDlg, TRUE);
		return TRUE;

		case ID1_CANCEL:
			EndDialog(hDlg, TRUE);
			return TRUE;
		}
	}
	return FALSE;
}
//==============================================================

//==============================================================  	
void InitPlanets()
{
	m_radius[0]= 2440 ;m_mass[0][0]=3.3 ;m_mass[0][1]= 23;//Меркурий
	m_radius[1]= 6050 ;m_mass[1][0]=4.9 ;m_mass[1][1]= 24;//Венера
	m_radius[2]= 6370 ;m_mass[2][0]=6.0 ;m_mass[2][1]= 24;//Земля
	m_radius[3]= 1740 ;m_mass[3][0]=7.4 ;m_mass[3][1]= 22;//Луна
	m_radius[4]= 3390 ;m_mass[4][0]=6.4 ;m_mass[4][1]= 23;//Марс
	m_radius[5]= 71400;m_mass[5][0]=1.9 ;m_mass[5][1]= 27;//Юпитер
	m_radius[6]= 60330;m_mass[6][0]=3.7 ;m_mass[6][1]= 26;//Сатурн
	m_radius[7]= 26700;m_mass[7][0]=8.1 ;m_mass[7][1]= 25;//Уран
	m_radius[8]= 25000;m_mass[8][0]=1.0 ;m_mass[8][1]= 26;//Нептун
	m_radius[9]= 1270 ;m_mass[9][0]=1.4 ;m_mass[9][1]= 22;//Плутон
}
//==============================================================  	
int x_to_Gx(double arg)
{
	return min_g_x+((max_g_x-min_g_x)/(max_a_x-min_a_x))*(arg-min_a_x);
}

int y_to_Gy(double arg)
{
	return max_g_y-((max_g_y-min_g_y)/(max_a_y-min_a_y))*(arg-min_a_y);
}
//==============================================================  	
void Set_CS_H()
{
	min_g_x= 25;
	min_g_y=250;
	max_g_x=225;
	max_g_y=450;
	min_a_x=0;
	min_a_y=0;
	max_a_x=limT;
	max_a_y=limH;
}
void Set_CS_V()
{
	min_g_x=250;
	min_g_y=250;
	max_g_x=450;
	max_g_y=450;
	min_a_x=0;
	min_a_y=0;
	max_a_x=limT;
	max_a_y=limV;
}
void Set_CS_A()
{
	min_g_x=475;
	min_g_y=250;
	max_g_x=675;
	max_g_y=450;
	min_a_x=0;
	min_a_y=0;
	max_a_x=limT;
	max_a_y=limA;
}

void Set_CS_DMPODT()
{
	min_g_x=25;
	min_g_y=50;
	max_g_x=225;
	max_g_y=175;
	min_a_x=0;
	min_a_y=0;
	max_a_x=limT;
	max_a_y=limDMPODT;
}
//==============================================================  	
void set_dmpodt()
{
int t=1;
	while (t==1)
		{
		dmpodt=dmpodt-0.01;
		if (dmpodt*c/m-g <= S_rocket_alim) t=2;
		}
}
//==============================================================  	
int Set_A_coords_plus_first_count()
{
	m=(S_rocket_um + S_rocket_fm)*1000.0;
	dmpodt=S_rocket_fu*1000.0;
	c=S_rocket_fv*1000.0;
	t=0;
	dt=0.001;
	v=0;
	h=0;
	M=S_planet_mass;
	R=S_planet_radius*1000.0;
	G=6.672*pow(10.0,-11);
	g=G*M/R/R;
	limDMPODT=dmpodt*1.05;
	if (dmpodt*c/m < g) return 2;
	else
		{
		while (m>S_rocket_um*1000)
			{	
			a =	dmpodt*c/m-g;
			if (a > S_rocket_alim) 
				{
				set_dmpodt();
				a =	dmpodt*c/m-g;
				}
			h+=dt*v;
			v+=dt*a;
			g =G*M/(R+h)/(R+h);
			m-=dmpodt*dt;
			v2k=sqrt(2*M*G/(R+h));
			t+=dt;
		}
		limT=t*1.05;
		limH=h*1.05;
		if (v>=sqrt(2*M*G/R)) limV=v*1.05;
		else limV=sqrt(2*M*G/R)*1.05;
		limA=a*1.05;
		return 1;
		}
}
//==============================================================
void Model()
{
	double kx1,kx2,kx3,kx4;
	double kv1,kv2,kv3,kv4;
	int i;
	char temp[80];
	RECT rec1;
	m=(S_rocket_um + S_rocket_fm)*1000.0;
	dmpodt=S_rocket_fu*1000.0;
	c=S_rocket_fv*1000.0;
	t=0;
	dt=limT*0.00005;
	v=0;
	h=0;
	M=S_planet_mass;
	R=S_planet_radius*1000.0;
	G=6.672*pow(10.0,-11);
	g=G*M/R/R;
	
	i=0;
	SelectObject (memdc, GetStockObject (BLACK_BRUSH));	
	Rectangle(memdc,250, 50,650,200);
	if (Out==1)
	{
		TextOut(memdc,250,50,"Время(с).",9);
		TextOut(memdc,250,70,"Высота(км).",11);
		TextOut(memdc,250,90,"Скорость(км/c).",15);
		TextOut(memdc,250,110,"Ускорение(км/c*c).",17);
		TextOut(memdc,250,130,"Топливо(т).",11);
		TextOut(memdc,250,150,"g(м/c*c).",9);
		TextOut(memdc,250,170,"Вторая космическая(км/с).",25);
	}	
	SetTextColor(memdc, RGB(0,0,0));
	SetBkColor(memdc, RGB(191,191,191));
	
	sprintf (temp,"%lf",limDMPODT*0.001);
	TextOut(memdc,26,32,temp,5);
	TextOut(memdc,66,32,"т/с.",4);
	sprintf (temp,"%lf",limT);
	TextOut(memdc,180,176,temp,5);
	TextOut(memdc,220,176,"с.",2);
	TextOut(memdc,180,451,temp,5);
	TextOut(memdc,220,451,"с.",2);
	TextOut(memdc,405,451,temp,5);
	TextOut(memdc,445,451,"с.",2);
	TextOut(memdc,630,451,temp,5);
	TextOut(memdc,675,451,"с.",2);
	sprintf (temp,"%lf",limH*0.001);
	TextOut(memdc,25,233,temp,5);
	TextOut(memdc,75,233,"км.",3);
	sprintf (temp,"%lf",limV*0.001);
	TextOut(memdc,250,233,temp,5);
	TextOut(memdc,290,233,"км/с.",5);
	sprintf (temp,"%lf",limA);
	TextOut(memdc,475,233,temp,5);
	TextOut(memdc,515,233,"м/с*с.",6);
	InvalidateRect(hwnd,NULL,TRUE);
	UpdateWindow(hwnd);
	
	SetTextColor(memdc, RGB(255,255,255));
	SetBkColor(memdc, RGB(0,0,0));
	
	for (t;m>S_rocket_um*1000;t+=dt)
		{	
		a =	dmpodt*c/m-g;
		if (a > S_rocket_alim) 
			{
			set_dmpodt();
			a =	dmpodt*c/m-g;
			}
		kx1=(v)			   *dt;
		kv1=dV(0,h)        *dt;
		kx2=(v+kv1/2)	   *dt;
		kv2=dV(0.5,h+kx1/2)*dt;
		kx3=(v+kv2/2)	   *dt;
		kv3=dV(0.5,h+kx2/2)*dt;
		kx4=(v+kv3)		   *dt;
		kv4=dV(1,h+kx3)	   *dt;
		
		h+=(kx1+2*kx2+2*kx3+kx4)/6;
		v+=(kv1+2*kv2+2*kv3+kv4)/6;
		g =G*M/(R+h)/(R+h);
		m-=dmpodt*dt;
		v2k=sqrt(2*M*G/(R+h));
		
		Set_CS_H();
		SetPixel(memdc,x_to_Gx(t),y_to_Gy(h),RGB(0,0,255));
		rec1.top=y_to_Gy(h)-1;
		rec1.left=x_to_Gx(t)-1;
		rec1.right=x_to_Gx(t)+1;
		rec1.bottom=y_to_Gy(h)+1;
		InvalidateRect(hwnd,&rec1,TRUE);
		UpdateWindow(hwnd);
		
		Set_CS_V();
		SetPixel(memdc,x_to_Gx(t),y_to_Gy(v),RGB(0,0,255));
		rec1.top=y_to_Gy(v)-1;
		rec1.left=x_to_Gx(t)-1;
		rec1.right=x_to_Gx(t)+1;
		rec1.bottom=y_to_Gy(v)+1;
		InvalidateRect(hwnd,&rec1,TRUE);
		UpdateWindow(hwnd);
		
		SetPixel(memdc,x_to_Gx(t),y_to_Gy(v2k),RGB(255,0,0));
		rec1.top=y_to_Gy(v2k)-1;
		rec1.left=x_to_Gx(t)-1;
		rec1.right=x_to_Gx(t)+1;
		rec1.bottom=y_to_Gy(v2k)+1;
		InvalidateRect(hwnd,&rec1,TRUE);
		UpdateWindow(hwnd);
		
		Set_CS_A();
		SetPixel(memdc,x_to_Gx(t),y_to_Gy(a),RGB(0,0,255));
		rec1.top=y_to_Gy(a)-1;
		rec1.left=x_to_Gx(t)-1;
		rec1.right=x_to_Gx(t)+1;
		rec1.bottom=y_to_Gy(a)+1;
		InvalidateRect(hwnd,&rec1,TRUE);
		UpdateWindow(hwnd);
		
		Set_CS_DMPODT();
		SetPixel(memdc,x_to_Gx(t),y_to_Gy(dmpodt),RGB(0,0,255));
		rec1.top=y_to_Gy(dmpodt)-1;
		rec1.left=x_to_Gx(t)-1;
		rec1.right=x_to_Gx(t)+1;
		rec1.bottom=y_to_Gy(dmpodt)+1;
		InvalidateRect(hwnd,&rec1,TRUE);
		UpdateWindow(hwnd);
		
		if ((t>i*dt)&&(Out==1))
			{
			i+=20;
			sprintf (temp,"%lf",t);
			TextOut(memdc,400,50,temp,6);
			sprintf (temp,"%lf",h*0.001);
			TextOut(memdc,400,70,temp,6);
			sprintf (temp,"%lf",v*0.001);
			TextOut(memdc,400,90,temp,6);
			sprintf (temp,"%lf",a*0.001);
			TextOut(memdc,400,110,temp,6);
			sprintf (temp,"%lf",m*0.001-S_rocket_um);
			TextOut(memdc,400,130,temp,6);
			sprintf (temp,"%lf",g);
			TextOut(memdc,450,150,temp,6);
			sprintf (temp,"%lf",sqrt(2*M*G/(R+h))*0.001);
			TextOut(memdc,450,170,temp,6);
			
			rec1.top=50;
			rec1.left=400;
			rec1.right=500;
			rec1.bottom=185;
			InvalidateRect(hwnd,&rec1,TRUE);
			UpdateWindow(hwnd);
			}
		}
	if (Out==1)
		{
		sprintf (temp,"%lf",t);
		TextOut(memdc,400,50,temp,5);
		sprintf (temp,"%lf",h*0.001);
		TextOut(memdc,400,70,temp,5);
		sprintf (temp,"%lf",v*0.001);
		TextOut(memdc,400,90,temp,5);
		sprintf (temp,"%lf",a*0.001);
		TextOut(memdc,400,110,temp,5);
		sprintf (temp,"%lf",m*0.001-S_rocket_um);
		TextOut(memdc,400,130,temp,5);
		InvalidateRect(hwnd,NULL,TRUE);
		UpdateWindow(hwnd);
		}
	if (v>=v2k) res=1;
	else		res=0;
}
//==============================================================
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
Model();
MessageBox(hwnd, "Моделирование завершено.","Информация",MB_OK | MB_ICONINFORMATION);
SelectObject (memdc, GetStockObject (BLACK_BRUSH));	
Rectangle(memdc,250, 50,650,200);
if (res==1) TextOut(memdc,250,110,"РАКЕТА НАБРАЛА ВТОРУЮ КОСМИЧЕСКУЮ СКОРОСТЬ.",43);	
else		TextOut(memdc,250,110,"РАКЕТА НЕ НАБРАЛА ВТОРУЮ КОСМИЧЕСКУЮ СКОРОСТЬ.",46);	
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
return 0;
}
//==============================================================
double dV(double argt, double argx)
{
return (dmpodt*c/(m-dmpodt*argt)-G*M/(R+argx)/(R+argx));
}
//==============================================================

Соседние файлы в папке ProReact1