Скачиваний:
44
Добавлен:
06.05.2013
Размер:
6.6 Кб
Скачать
// Каркас приложения для Windows'95
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <iostream.h>
#include "resource.h"

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);

char szWinName[] = "Мое Окно";
HWND hwnd;
HDC memdc;
PAINTSTRUCT paintstruct;
HPEN PenB1;

float g=9.8;
float pi = 3.14159;
//double alpha;
float delta=0.01;
//float V0=100;
int meaning;
float L=30;
//float T0;
//float T;
float v=0;
float t=0;
float fi=0;
float omega1=0.5;//изменение длины
float omega2=1;//частота маятника
float faza1=0;
float faza2=0;

//float l;
float l1=90;
float l2=90;
//float dS;
float y=89.443;
float x=10;
float x1=10;
float x2=10;
float X=10;
float deltax;
float deltay;
//float k=10;
//float m=10;

float gamma=-0.1;

void OSI(void);


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(NULL,IDI_APPLICATION); //стандартная иконка
wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
wcl.lpszMenuName= (LPSTR)MYMENU; //NULL; //без меню
wcl.cbClsExtra=0;
wcl.cbWndExtra=0;
// Заполнить окно цветом
wcl.hbrBackground=(HBRUSH) GetStockObject(BLACK_BRUSH);

if (!RegisterClass (&wcl)) return 0;

// Создать окно
hwnd = CreateWindow(szWinName,"маятник",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, // горизонтальное положение окна
CW_USEDEFAULT, // вертикальное положение окна
CW_USEDEFAULT, // ширина окна
CW_USEDEFAULT, // высота окна
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;

static int maxX, maxY;
RECT yurik;
{
yurik.left=0;
yurik.right=1000;
yurik.top=0;
yurik.bottom=1000;
}

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 (WHITE_BRUSH);//цвет экрана
SelectObject (memdc, hbrush);
PatBlt (memdc, 0,0, maxX,maxY,PATCOPY);
ReleaseDC (hwnd, hdc);

PenB1=CreatePen (PS_SOLID,1,RGB(0,1000,0));
TextOut(memdc,60,470,"траектория",10);
TextOut(memdc,540,360,"фазовый портрет",15);
//TextOut(memdc,50,40,"Вывод текста",12);

hbrush = GetStockObject (WHITE_BRUSH);
SelectObject (memdc, CreatePen (PS_SOLID,3 /*ширина пера*/
,RGB(1000,0,0)));//цвет рисунков(эллипс и т.п.)
SelectObject (memdc,hbrush);
OSI();//оси
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_ABOUT:
MessageBox(hwnd, "Хелп сперли.",
"хелп",MB_OK | MB_ICONINFORMATION);
break;

case ID_EXIT:
if (MessageBox(hwnd, "Вы уверены?",
"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
break;

case ID_start:
SetTimer(hwnd,1,10,NULL);
Ellipse(memdc,99,149,101,151);//макс.высота
Ellipse(memdc,99,449,101,451);//мин.высота
//y=sqrt(l1*l1-x1*x1);
//TextOut(memdc,100,470,"траектория",12);
break;

case ID_stop:
KillTimer(hwnd,1);
break;
}
break;
case WM_TIMER:
switch(wParam)
{
case 1:
/*t=t+delta; //первая прога
alpha=1.02;
g=9.8;
//l=2*(V0*V0)*sin( alpha )*cos( alpha )/g;
T0=2*V0*(sin( alpha ))/g;
T=t/T0;
AIMX=T;
//aimx=AIMX*l;
AIMY=T*(tan( alpha ))*(1-T);
//aimy=AIMY*l;
if(AIMY>0)
{Ellipse(memdc,AIMX*250+100,-AIMY*250+400,AIMX*250+102,-AIMY*250+402);}
//MessageBox(hwnd,"пока работает","УРА!",MB_OK | MB_ICONINFORMATION);*/
t=t+delta;
l1=L*(2+cos(omega1*(t)+fi));
l2=L*(2+cos(omega1*(t+delta)+fi));
omega2=2*pi*sqrt(g/l1);
x1=X*exp(gamma*t)*cos(omega2*t);
omega2=2*pi*sqrt(g/l2);
x2=X*exp(gamma*(t+delta))*cos(omega2*(t+delta))+x1*(l2-l1)/sqrt(l2*l1);
deltax=x2-x1;
deltay=sqrt(l2*l2-x2*x2)-sqrt(l1*l1-x1*x1);
x=x+deltax;
//x=X*exp(gamma*t)*cos(omega2*t)+x*(l2-l1)/l2;//old
//y=y+(sqrt(l2*l2-x2*x2)-sqrt(l1*l1-x1*x1));
y=y+deltay;
v=deltax/delta;
SetPixel(memdc,(int)(5*x+100),(int)(5*y),RGB(0,0,0));//траектория
/*SetPixel(memdc,(int)(10*t+200),(int)(100*deltax+200),RGB(1000,1000,0));//deltax
SetPixel(memdc,(int)(10*t+200),200,RGB(1000,0,0));
SetPixel(memdc,(int)(10*t+200),(int)(5*x+400),RGB(1000,1000,0));//x
SetPixel(memdc,(int)(10*t+200),400,RGB(1000,0,0));*/
SetPixel(memdc,(int)(5*v+600),(int)(5*x+300),RGB(1000,0,0));//фазовый портрет
//Ellipse(memdc,99,99,101,101);//точка подвеса


//SetPixel(memdc,(int)(10*x+300),(int)(10*y+300),RGB(100,100,100));

InvalidateRect(hwnd,&yurik,TRUE);
break;

}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
void OSI(void)
{
int i;
SelectObject(memdc,PenB1);
MoveToEx(memdc,100,150,NULL);
LineTo(memdc,100,450);
MoveToEx(memdc,600,250,NULL);
LineTo(memdc,600,350,NULL);
MoveToEx(memdc,300,300,NULL);
LineTo(memdc,900,300,NULL);

for(i=3;i<=9;i++)
{
MoveToEx(memdc,98,50*i,NULL);
LineTo(memdc,102,50*i);
}

}








Соседние файлы в папке Колебания маятника переменной длины