Добавил:
sergun
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:II курс - курсовые / Движение в центральном поле / test / progr
.c#include <windows.h>
#include "resource.h"
#include "help.h"
#include <stdio.h>
#include <math.h>
#include <string.h>
#define AnimX 350
#define AnimY 250
//=============================================================
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK WindowFunc2(HWND,UINT,WPARAM,LPARAM);
double f_x(double x_r,double y_r);
double f_y(double x_r,double y_r);
void rect(void);
int kepler(double x,double y,double t);
BOOL chk=0;
BOOL CALLBACK DialogProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam);
DWORD WINAPI ThreadProc (LPVOID lpParameter);
HDC hdc,hdc2;
HBITMAP hbit;
HBRUSH hbrush;
HPEN pen_green,pen_blue,pen_black,pen_red;
DWORD Tid;
HANDLE hct;
HANDLE hSem;
RECT rect1,rect2,rect3,rect4,rect5,rect6;
FILE *file;
char str1[80]="1",str2[80]="0",str3[80],str4[80],str5[80],str6[80],str7[80],str8[80],str9[80];
double R=255,G=0,B=0,R_max,R_;
double A,V_0,R_0,m,alfa,W,r_norm=5,E_norm=1,T_e=1,t_norm=1,time=1,energy;
char szWinName[] = "Мое Окно",szWinName2[] = "Мое Окно2";
HWND hwnd,hwnd2;
HDC memdc,memdc2;
PAINTSTRUCT paintstruct;
HINSTANCE ThisInst;
//==============================================================
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
MSG msg;
WNDCLASS wcl;
WNDCLASS wc2;
// Определить класс окна
wcl.hInstance=hThisInst;
wcl.lpszClassName=szWinName; //имя класса окна
wcl.lpfnWndProc=WindowFunc; //функция окна
wcl.style=1; // стиль по умолчанию
wcl.hIcon=LoadIcon(hThisInst,IDI_APPLICATION); //стандартная иконка
wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName= (LPSTR)KS_MENU_2; //NULL; //без меню
wcl.cbClsExtra=0;
wcl.cbWndExtra=0;
// Заполнить окно цветом
wcl.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);
if (!RegisterClass (&wcl)) return 0;
// Создать окно
hwnd = CreateWindow(szWinName,"Движение в центральном поле",
WS_OVERLAPPEDWINDOW,
5, // горизонтальное положение окна
0, // вертикальное положение окна
430,// ширина окна
510,// высота окна
HWND_DESKTOP,
NULL,
hThisInst,
NULL);
// Показать окно и нарисовать содержимое
ShowWindow(hwnd,nWinMode);
UpdateWindow (hwnd);
wc2.hInstance=hThisInst;
wc2.lpszClassName=szWinName2; //имя класса окна
wc2.lpfnWndProc=WindowFunc2; //функция окна
wc2.style=1; // стиль по умолчанию
wc2.hIcon=LoadIcon(hThisInst ,IDI_APPLICATION); //стандартная иконка
wc2.hCursor=LoadCursor(NULL,IDC_ARROW);
wc2.lpszMenuName=NULL;
wc2.cbClsExtra=0;
wc2.cbWndExtra=0;
// Заполнить окно цветом
wc2.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);
if (!RegisterClass (&wc2)) return 0;
// Создать окно
hwnd2 = CreateWindow(szWinName2,"Графики",
WS_OVERLAPPEDWINDOW,
435, // горизонтальное положение окна
0, // вертикальное положение окна
390,// ширина окна
510,// высота окна
hwnd,
NULL,
hThisInst,
NULL);
// Показать окно и нарисовать содержимое
ShowWindow(hwnd2,nWinMode);
UpdateWindow (hwnd2);
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)
{
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);
hSem = CreateSemaphore(NULL,1,1,"mysem");
hbit = CreateCompatibleBitmap (hdc,maxX,maxY);
pen_green = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
pen_blue = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
pen_black = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
pen_red = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
SelectObject (memdc, hbrush);
PatBlt (memdc, 0,0, maxX,maxY,PATCOPY);
SetBkColor(memdc,RGB(192,192,192));
ReleaseDC (hwnd, hdc);
/* hct = CreateThread(NULL,0,ThreadProc,NULL,0,&Tid);*/
EnableMenuItem(GetMenu(hwnd),ID_STOP,MF_ENABLED);
EnableMenuItem(GetMenu(hwnd),ID_START,MF_GRAYED);
break;
case WM_LBUTTONDOWN:
if(R==255)
{
R=0;
G=255;
B=0;
}
else if(G==255)
{
R=0;
G=0;
B=255;
}
else
{
R=255;
G=0;
B=0;
}
break;
case WM_PAINT:
hdc = BeginPaint(hwnd,&paintstruct);
WaitForSingleObject(hSem,INFINITE);
BitBlt (hdc, 0, 0, maxX,maxY, memdc,0,0,SRCCOPY);
ReleaseSemaphore(hSem,1,NULL);
EndPaint(hwnd,&paintstruct);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_DIAL:
DialogBox(ThisInst, MAKEINTRESOURCE(KS_DIALOG_1),hwnd, DialogProc);
break;
case ID_CLEAR:
WaitForSingleObject(hSem,INFINITE);
hbrush = GetStockObject (LTGRAY_BRUSH);
SelectObject (memdc, hbrush);
PatBlt (memdc, 0,0, maxX,maxY,PATCOPY);
SelectObject (memdc2, hbrush);
PatBlt (memdc2, 0,0, maxX,maxY,PATCOPY);
rect();
ReleaseSemaphore(hSem,1,NULL);
InvalidateRect(hwnd,NULL,TRUE);
InvalidateRect(hwnd2,NULL,TRUE);
break;
case ID_START:
ResumeThread(hct);
EnableMenuItem(GetMenu(hwnd),ID_STOP,MF_ENABLED);
EnableMenuItem(GetMenu(hwnd),ID_START,MF_GRAYED);
break;
case ID_STOP:
WaitForSingleObject(hSem,INFINITE);
TerminateThread(hct,1);
ReleaseSemaphore(hSem,1,NULL);
// EnableMenuItem(GetMenu(hwnd),ID_STOP,MF_GRAYED);
// EnableMenuItem(GetMenu(hwnd),ID_START,MF_ENABLED);
break;
case ID_EXIT:
if (MessageBox(hwnd, "Вы уверены?",
"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
break;
case ID_HLP:
WinHelp(hwnd,"help.hlp",HELP_FINDER,0);
break;
}
break;
case WM_DESTROY:
CloseHandle(hSem);
PostQuitMessage(0);
break;
case WM_CLOSE:
if (MessageBox(hwnd, "Вы уверены?",
"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK WindowFunc2(HWND hwnd2,UINT message,
WPARAM wParam,LPARAM lParam)
{
static int maxX, maxY;
switch (message)
{
case WM_CREATE:
maxX = GetSystemMetrics (SM_CXSCREEN);
maxY = GetSystemMetrics (SM_CYSCREEN);
hdc2 = GetDC(hwnd2);
memdc2 = CreateCompatibleDC(hdc2);
hbit = CreateCompatibleBitmap (hdc2,maxX,maxY);
SelectObject (memdc2, hbit);
hbrush = GetStockObject (LTGRAY_BRUSH);
SelectObject (memdc2, hbrush);
PatBlt (memdc2, 0,0, maxX,maxY,PATCOPY);
SetBkColor(memdc2,RGB(192,192,192));
rect();
InvalidateRect(hwnd,NULL,TRUE);
InvalidateRect(hwnd2,NULL,TRUE);
ReleaseDC (hwnd2, hdc2);
/* hct = CreateThread(NULL,0,ThreadProc,NULL,0,&Tid);*/
break;
case WM_PAINT:
hdc2 = BeginPaint(hwnd2,&paintstruct);
WaitForSingleObject(hSem,INFINITE);
BitBlt (hdc2, 0, 0, maxX,maxY, memdc2,0,0,SRCCOPY);
ReleaseSemaphore(hSem,1,NULL);
EndPaint(hwnd2,&paintstruct);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_CLEAR:
WaitForSingleObject(hSem,INFINITE);
hbrush = GetStockObject (LTGRAY_BRUSH);
SelectObject (memdc2, hbrush);
PatBlt (memdc2, 0,0, maxX,maxY,PATCOPY);
rect();
ReleaseSemaphore(hSem,1,NULL);
InvalidateRect(hwnd2,NULL,TRUE);
break;
}
break;
case WM_DESTROY:
CloseHandle(hSem);
PostQuitMessage(0);
break;
case WM_CLOSE:
if (MessageBox(hwnd, "Вы уверены?",
"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
break;
default:
return DefWindowProc (hwnd2, message, wParam, lParam);
}
return 0;
}
//==============================================================
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
double t,d_t=0.01,y,x,v_x,v_y,x_last,y_last,T,U,E,t_l,t_e,step=0;
double kvx_1,kvx_2,kvx_3,kvx_4;
double kvy_1,kvy_2,kvy_3,kvy_4,E_e=1;
double ky_1,ky_2,ky_3,ky_4;
double kx_1,kx_2,kx_3,kx_4;
int inval=0;
x=1.0; ;
y=0;
v_x=0;
v_y=1.0;
file=fopen("\\test.txt","w");
R=255;
G=0;
B=0;
rect();
InvalidateRect(hwnd,NULL,TRUE);
InvalidateRect(hwnd2,NULL,TRUE);
for (t=0,t_e=0;;t+=d_t,t_e+=d_t)
{
kvx_1=f_x(x,y)*d_t;
kx_1=v_x*d_t;
kvy_1=f_y(x,y)*d_t;
ky_1=v_y*d_t;
kvx_2=f_x(x+kx_1/2.0,y+ky_1/2.0)*d_t;
kx_2=(v_x+kvx_1/2.0)*d_t;
kvy_2=f_y(x+kx_1/2.0,y+ky_1/2.0)*d_t;
ky_2=(v_y+kvy_1/2.0)*d_t;
kvx_3=f_x(x+kx_2/2.0,y+ky_2/2.0)*d_t;
kx_3=(v_x+kvx_2/2.0)*d_t;
kvy_3=f_y(x+kx_2/2.0,y+ky_2/2.0)*d_t;
ky_3=(v_y+kvy_2/2.0)*d_t;
kvx_4=f_x(x+kx_3,y+ky_3)*d_t;
kx_4=(v_x+kvx_3)*d_t;
kvy_4=f_y(x+kx_3,y+ky_3)*d_t;
ky_4=(v_y+kvy_3)*d_t;
v_x=v_x+(kvx_1+2.0*kvx_2+2.0*kvx_3+kvx_4)/6.0;
v_y=v_y+(kvy_1+2.0*kvy_2+2.0*kvy_3+kvy_4)/6.0;
x_last=x;
y_last=y;
x=x+(kx_1+2.0*kx_2+2.0*kx_3+kx_4)/6.0;
y=y+(ky_1+2.0*ky_2+2.0*ky_3+ky_4)/6.0;
R_=sqrt(x*x+y*y);
if(R_max<R_)
R_max=R_;
T=(v_x*v_x+v_y*v_y)/2.0;
U=-W*pow((x*x+y*y),-1./2.0-alfa/2.0);
E=T+U;
/*if(U<-3)
{
MessageBox(hwnd,"Материалтная точка столкнулась с землей","Внимание !",MB_OK | MB_ICONINFORMATION);
break;
}
*/
if(U>-0.003)
{
MessageBox(hwnd,"Материальная точка ушла на бесконечность","Внимание !",MB_OK | MB_ICONINFORMATION);
break;
}
fprintf(file,"%.15f %f %f\n",E,T,R_max);
//fprintf(file,"%.f %f %.15f\n",t,y,E);
if(!step)
{
if(E>-0.005)
{ r_norm=10;
E_norm=0.3;
t_norm=20;
}
else if((E<=-0.005)&&(E>=-0.04))
{
r_norm=40;
E_norm=1;
t_norm=100;
}
else if((E<=-0.04)&&(E>=-0.1))
{
r_norm=15;
E_norm=1;
t_norm=10;
}
else if((E<-0.1)&&(E>=-0.2))
{
r_norm=5;
E_norm=1;
t_norm=10;
}
else if((E<-0.2)&&(E>=-0.55))
{
r_norm=3;
E_norm=4;
t_norm=2;
}
else
{
r_norm=2;
E_norm=4;
t_norm=1;
}
time=295/20*t_norm;
energy=200.0*E_norm/100.0;
sprintf(str3,"%.0f",time);
sprintf(str4,"%.0f",time/2);
sprintf(str5,"%.0f",0.0);
sprintf(str6,"%.2f",energy);
sprintf(str7,"%.2f",energy/2);
sprintf(str8,"%.2f",-1*energy);
sprintf(str9,"%.2f",-1*energy/2);
SendMessage(hwnd,WM_COMMAND,ID_CLEAR,0);
step=1;
}
t_l=20*t_e/t_norm;
if(chk==TRUE)
inval=kepler(x,y,t);
rect1.top=(long)((200-150*y/r_norm)-1);
rect1.left=(long)((250+150*x/r_norm)-1);
rect1.right=(long)((250+150*x/r_norm)+1);
rect1.bottom=(long)((200-150*y/r_norm)+1);
rect2.top=(long)((200-200*T/E_norm)-1);
rect2.left=(long)(t_l+35-1);
rect2.right=(long)(t_l+35+1);
rect2.bottom=(long)((200-200*T/E_norm)+1);
rect3.top=(long)((200-200*U/E_norm)-1);
rect3.left=(long)(t_l+35-1);
rect3.right=(long)(t_l+35+1);
rect3.bottom=(long)((200-200*U/E_norm)+1);
rect4.top=(long)((200-200*E/E_norm)-1);
rect4.left=(long)(t_l+35-1);
rect4.right=(long)(t_l+35+1);
rect4.bottom=(long)((200-200*E/E_norm)+1.0);
rect6.top=(long)(200.0);
rect6.left=(long)(250.0+150.0*x/r_norm);
rect6.right=(long)(250.0);
rect6.bottom=(long)(200.0-150.0*y/r_norm);
if(t_l>320)
{
t_e=0;
sprintf(str5,"%.0f",time);
time+=285/20*t_norm;
sprintf(str3,"%.0f",time);
sprintf(str4,"%.0f",time-285/40*t_norm);
SendMessage(hwnd2,WM_COMMAND,ID_CLEAR,0);
}
WaitForSingleObject(hSem,INFINITE);
SetPixel(memdc,(int)(250+150*x/r_norm),(int)(200-150*y/r_norm),RGB(R,G,B));
SetPixel(memdc2,(int)(t_l+35),(int)(200.0-200.0*T/E_norm),RGB(255,0,0));
SetPixel(memdc2,(int)(t_l+35),(int)(200.0-200.0*U/E_norm),RGB(0,255,0));
SetPixel(memdc2,(int)(t_l+35),(int)(200.0-200.0*E/E_norm),RGB(0,0,255));
ReleaseSemaphore(hSem,1,NULL);
InvalidateRect(hwnd2,&rect2,TRUE);
InvalidateRect(hwnd2,&rect3,TRUE);
InvalidateRect(hwnd2,&rect4,TRUE);
UpdateWindow(hwnd2);
InvalidateRect(hwnd,&rect1,TRUE);
if (inval)
InvalidateRect(hwnd,&rect6,TRUE);
//Sleep(1);
UpdateWindow(hwnd);
}
return 0;
}
//==============================================================
//==============================================================
//==============================================================
BOOL CALLBACK DialogProc(HWND hDlg,UINT uMsg, WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case (WM_INITDIALOG):
SetDlgItemText(hDlg,ID_W,str1);
SetDlgItemText(hDlg,ID_ALFA,str2);
CheckDlgButton(hDlg,ID_KEPLER,chk);
return TRUE;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDOK:
GetDlgItemText(hDlg,ID_W,str1,80);
W=(double)atof(str1);
GetDlgItemText(hDlg,ID_ALFA,str2,80);
alfa=(double)atof(str2);
chk=IsDlgButtonChecked(hDlg,ID_KEPLER);
if((alfa>=-0.1)&&(alfa<0.2)&&(W>0)&&(W<2))
{
WaitForSingleObject(hSem,INFINITE);
TerminateThread(hct,1);
hct = CreateThread(NULL,0,ThreadProc,NULL,0,&Tid);
ReleaseSemaphore(hSem,1,NULL);
EndDialog(hDlg, TRUE);
}
else
{
MessageBox(hwnd,"Вы ввели недопустимое значение !","Внимание !",MB_OK | MB_ICONASTERISK);
}
return TRUE;
case IDCANCEL:
EndDialog(hDlg, TRUE);
return TRUE;
}
}
return FALSE;
}
double f_x(double x,double y)
{
double out;
out=-W*x*(alfa+1.0)*pow((x*x+y*y),(-alfa/2.0-1.5));
return out;
}
double f_y(double x,double y)
{
double out;
out=-W*y*(alfa+1.0)*pow((x*x+y*y),(-alfa/2.0-1.5));
return out;
}
void rect(void)
{
// SelectObject (memdc, GetStockObject (RGB(255,255,0)));
SelectObject (memdc, pen_black);
SelectObject (memdc2, pen_black);
//Ellibpse(memdc,290,190,310,210);
MoveToEx(memdc2,35,400,NULL);
LineTo(memdc2,35,0);
MoveToEx(memdc2,35,0,NULL);
LineTo(memdc2,37,10);
MoveToEx(memdc2,35,0,NULL);
LineTo(memdc2,33,10);
TextOut(memdc2,38,180,str5,strlen(str5));
MoveToEx(memdc2,160+35,195,NULL);
LineTo(memdc2,160+35,205);
TextOut(memdc2,160+35,180,str4,strlen(str4));
TextOut(memdc2,320+35,180,str3,strlen(str3));
MoveToEx(memdc2,320+35,195,NULL);
LineTo(memdc2,320+35,205);
TextOut(memdc2,290,205,"время,Ro/Vo",11);
MoveToEx(memdc2,5,200,NULL);
LineTo(memdc2,370,200);
MoveToEx(memdc2,360,198,NULL);
LineTo(memdc2,370,200);
MoveToEx(memdc2,360,202,NULL);
LineTo(memdc2,370,200);
TextOut(memdc2,38,5,"Энергия,m*Vo^2",14);
MoveToEx(memdc2,30,10,NULL);
LineTo(memdc2,40,10);
MoveToEx(memdc2,30,100,NULL);
LineTo(memdc2,40,100);
MoveToEx(memdc2,30,200+100,NULL);
LineTo(memdc2,40,200+100);
MoveToEx(memdc2,30,200+100*2,NULL);
LineTo(memdc2,40,200+100*2);
TextOut(memdc2,0,5,str6,strlen(str6));
TextOut(memdc2,0,100,str7,strlen(str7));
TextOut(memdc2,0,290,str9,strlen(str8));
TextOut(memdc2,0,390,str8,strlen(str9));
TextOut(memdc2,0,180,"0",1);
MoveToEx(memdc,0,200,NULL);
LineTo(memdc,500,200);
TextOut(memdc,390,202,"x/Ro",4);
TextOut(memdc,(int)(250+150/r_norm),202,"1",1);
MoveToEx(memdc,(int)(250+150/r_norm),195,NULL);
LineTo(memdc,(int)(250+150/r_norm),205);
TextOut(memdc,255,(int)(188-150/r_norm),"1",1);
MoveToEx(memdc,255,(int)(200-150/r_norm),NULL);
LineTo(memdc,245,(int)(200-150/r_norm));
MoveToEx(memdc,250,0,NULL);
LineTo(memdc,250,400);
TextOut(memdc,255,0,"y/Ro",4);
SelectObject (memdc2, pen_blue);
MoveToEx(memdc2,40,420,NULL);
LineTo(memdc2,50,420);
TextOut(memdc2,60,410,"Полная энергия",14);
SelectObject (memdc2, pen_red);
MoveToEx(memdc2,40,440,NULL);
LineTo(memdc2,50,440);
TextOut(memdc2,60,430,"Кинетическая энергия",20);
SelectObject (memdc2, pen_green);
MoveToEx(memdc2,40,460,NULL);
LineTo(memdc2,50,460);
TextOut(memdc2,60,450,"Потенциальная энергия",21);
}
int kepler(double x,double y,double t)
{
static cnt;
if (((t/t_norm>1)&&(t/t_norm<1.25))||((t/t_norm>0.25)&&(t/t_norm<0.5))||((t/t_norm>2.25)&&(t/t_norm<2.5)))
{
MoveToEx(memdc,250,200,NULL);
LineTo(memdc,(int)(250+150*x/r_norm),(int)(200-150*y/r_norm));
cnt=0;
return 1;
}
return 0;
}
Соседние файлы в папке test