Добавил:
sergun
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:II курс - курсовые / Реактивное движение / ProReact1 / 02react
.c#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));
}
//==============================================================