Добавил:
sergun
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:II курс - курсовые / Электростатическая линза / уФБМП / Win1
.c#define m_const_pi 3.141592654
#define m_const_e 1.6021892e-19
#define m_const_epsilon0 8.854187818e-12
#define m_const_deltat 1
#define INIFILE "C:\\lens.ini"
#define SAVE 1
#define LOAD 0
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <stdio.h>
#include "resource.h"
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK DialogProcBeam(HWND hwnd1,UINT no,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK DialogProcLens(HWND hwnd1,UINT no,WPARAM wParam,LPARAM lParam);
DWORD WINAPI ThreadProc(LPVOID lpParameter);
double f (double, double);
double g (double, double);
DrawLens();
CalculateAll();
IniFileWorks(char);
struct PNT {double rdot,r,zdot,z;};
//----------------------------Системные переменные-------------------
char szWinName[] = "Электростатическая линза";
HWND hwnd;
HDC memdc;
PAINTSTRUCT paintstruct;
HINSTANCE ThisInst;
//----------------------------Мои переменные-------------------------
double m_la=0, m_lb=0, m_lq=0; //Параметры линзы
double m_z0=0, m_z0dot=0, m_r0dot=0;
int m_r0count=0;
double m_r0[200]; //Параметры пучка
int wnd_x,wnd_y;
char m_bCalculated=0;
double focus[200];
int focused=0;
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
MSG msg;
WNDCLASS wcl;
ThisInst=hThisInst;
IniFileWorks(LOAD);
// Определить класс окна
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(LTGRAY_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);
IniFileWorks (LOAD);
// Цикл обработки сообщений
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
DeleteDC (memdc);
IniFileWorks(SAVE);
return msg.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
HDC hdc;
HBITMAP hbit;
HBRUSH hbrush;
RECT rect;
static HANDLE hct;
DWORD Tid;
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);
GetWindowRect(hwnd,&rect);
wnd_x=-(int)m_z0;
wnd_y=(rect.bottom - rect.top)/2;
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, "Электростатическая линза. \n\n Версия 1.0.\n © Машенька без медведей.",
"О сей замечательной программочке",MB_OK | MB_ICONINFORMATION);
break;
case ID_PARAMETERS_LENS:
DialogBox(ThisInst,MAKEINTRESOURCE(IDD_LENSPARAM),hwnd,DialogProcLens);
break;
case ID_PARAMETERS_BEAM:
DialogBox(ThisInst,MAKEINTRESOURCE(IDD_BEAMPARAM),hwnd,DialogProcBeam);
break;
case IDM_CALCULATE:
DrawLens();
hct = CreateThread(NULL, 0, ThreadProc, NULL, 0, &Tid);
InvalidateRect(hwnd,NULL,0);
break;
case IDM_STOPIT:TerminateThread(hct, 0);break;
case ID_HELPER:
WinHelp(hwnd,"help.hlp",HELP_FINDER,0);
break;
case ID_EXIT:
if (MessageBox(hwnd, "Вы уверены?",
"Выход",MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK DialogProcBeam(HWND hwnd2,UINT no,WPARAM wParam,LPARAM lParam)
{
char tmpstr[80];
int i;
HDC hdc2;
HBRUSH hbrush;
switch (no)
{
case WM_INITDIALOG:
sprintf(tmpstr, "%g", m_z0);
SetDlgItemText(hwnd2,IDC_EDIT1,tmpstr);
sprintf(tmpstr, "%g", m_z0dot);
SetDlgItemText(hwnd2,IDC_EDIT2,tmpstr);
break;
case WM_PAINT:
hdc2=GetDC(hwnd2);
for(i=0; i<m_r0count; i++)
{
sprintf(tmpstr, "%g", m_r0[i]);
TextOut(hdc2,20,200+25*i,tmpstr,strlen(tmpstr));
}
ReleaseDC(hwnd2,hdc2);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_ADD:
GetDlgItemText(hwnd2,IDC_EDIT3,tmpstr,80);
m_r0[m_r0count++]=atof(tmpstr);
hdc2=GetDC(hwnd2);
sprintf (tmpstr,"%g",m_r0[m_r0count-1]);
TextOut(hdc2,20,175+25*m_r0count,tmpstr,strlen(tmpstr));
ReleaseDC(hwnd2,hdc2);
break;
case IDC_DEL:
if (m_r0count>0)
{
hdc2=GetDC(hwnd2);
m_r0count--;
SelectObject (hdc2, CreatePen (PS_SOLID,0 /*ширина пера*/,RGB(191,191,191)));
hbrush = GetStockObject (LTGRAY_BRUSH); //получить кисть
SelectObject (hdc2, hbrush); // выбрать кисть
Rectangle(hdc2,20,200+25*m_r0count,100,220+25*m_r0count);
ReleaseDC(hwnd2,hdc2);
}
break;
case IDC_OK:
GetDlgItemText(hwnd2,IDC_EDIT1,tmpstr,80);
m_z0 = atof(tmpstr);
GetDlgItemText(hwnd2,IDC_EDIT2,tmpstr,80);
m_z0dot = atof(tmpstr);
case IDC_CANCEL:EndDialog (hwnd2,0);break;
}
break;
case WM_CLOSE:EndDialog(hwnd2,0);break;
}
return FALSE;
}
LRESULT CALLBACK DialogProcLens(HWND hwnd1,UINT no,WPARAM wParam,LPARAM lParam)
{
char tmpstr[80];
switch (no)
{
case WM_INITDIALOG:
sprintf(tmpstr, "%g", m_la*2);
SetDlgItemText(hwnd1,IDC_EDIT1,tmpstr);
sprintf(tmpstr, "%g", m_lb*2);
SetDlgItemText(hwnd1,IDC_EDIT2,tmpstr);
sprintf(tmpstr, "%g", m_lq);
SetDlgItemText(hwnd1,IDC_EDIT4,tmpstr);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
GetDlgItemText(hwnd1,IDC_EDIT1,tmpstr,80);
m_la = atof(tmpstr) / 2;
GetDlgItemText(hwnd1,IDC_EDIT2,tmpstr,80);
m_lb = atof(tmpstr) / 2;
GetDlgItemText(hwnd1,IDC_EDIT4,tmpstr,80);
m_lq = atof(tmpstr);
case IDCANCEL: EndDialog(hwnd1,0);break;
}
break;
case WM_CLOSE:EndDialog(hwnd1,0);break;
}
return FALSE;
}
IniFileWorks(char store)
{
char buffer[11];
char buf[4];
int i;
if(store)
{
sprintf(buffer, "%f", m_la);
WritePrivateProfileString("lens", "a", buffer, INIFILE);
sprintf(buffer, "%f", m_lb);
WritePrivateProfileString("lens", "b", buffer, INIFILE);
sprintf(buffer, "%f", m_lq);
WritePrivateProfileString("lens", "q", buffer, INIFILE);
sprintf(buffer, "%f", m_r0dot);
WritePrivateProfileString("beam", "r0dot", buffer, INIFILE);
sprintf(buffer, "%f", m_z0);
WritePrivateProfileString("beam", "z0", buffer, INIFILE);
sprintf(buffer, "%f", m_z0dot);
WritePrivateProfileString("beam", "z0dot", buffer, INIFILE);
//-----------------------------------------------------------------//
sprintf(buffer, "%d", m_r0count);
WritePrivateProfileString("beam", "r0count", buffer, INIFILE);
for(i=0; i<m_r0count; i++)
{
sprintf(buffer, "%f", m_r0[i]);
itoa(i, buf, 10);
WritePrivateProfileString("beam", buf, buffer, INIFILE);
}
}
else
{
GetPrivateProfileString("lens", "a", "0", buffer, 10, INIFILE);
m_la = atof(buffer);
GetPrivateProfileString("lens", "b", "0", buffer, 10, INIFILE);
m_lb = atof(buffer);
GetPrivateProfileString("lens", "q", "0", buffer, 10, INIFILE);
m_lq = atof(buffer);
GetPrivateProfileString("beam", "r0dot", "0", buffer, 10, INIFILE);
m_r0dot = atof(buffer);
GetPrivateProfileString("beam", "z0", "0", buffer, 10, INIFILE);
m_z0 = atof(buffer);
GetPrivateProfileString("beam", "z0dot", "0", buffer, 10, INIFILE);
m_z0dot = atof(buffer);
//------------------------------------------------------//
GetPrivateProfileString("beam", "r0count", "0", buffer, 10, INIFILE);
m_r0count = atoi(buffer);
for(i=0; i<m_r0count; i++)
{
char buf[4];
itoa(i, buf, 10);
GetPrivateProfileString("beam", buf, "0", buffer, 10, INIFILE);
m_r0[i] = atof(buffer);
}
}
}
double f(double r, double z)
{
return ((1)*m_lq*4*m_const_e/(4*m_const_pi*m_const_epsilon0))*
(
(m_lb-r)/pow(sqrt((m_la-z)*(m_la-z) + (m_lb-r)*(m_lb-r)),3)-
(m_lb-r)/pow(sqrt((m_la+z)*(m_la+z) + (m_lb-r)*(m_lb-r)),3)-
(m_lb+r)/pow(sqrt((m_la-z)*(m_la-z) + (m_lb+r)*(m_lb+r)),3)+
(m_lb+r)/pow(sqrt((m_la+z)*(m_la+z) + (m_lb+r)*(m_lb+r)),3));
}
double g(double r, double z)
{
return((1)*m_lq*4*m_const_e/(4*m_const_pi*m_const_epsilon0))*
(
-(m_la+z)/pow(sqrt((m_la+z)*(m_la+z) + (m_lb-r)*(m_lb-r)),3)-
(m_la+z)/pow(sqrt((m_la+z)*(m_la+z) + (m_lb+r)*(m_lb+r)),3)+
(m_la-z)/pow(sqrt((m_la-z)*(m_la-z) + (m_lb-r)*(m_lb-r)),3)+
(m_la-z)/pow(sqrt((m_la-z)*(m_la-z) + (m_lb+r)*(m_lb+r)),3)
);
}
Calculate(int n)
{
struct PNT point_prev, point;
int ii = 0,i;
int x,y,x1,y1,n1;
char focusfound=0;
point_prev.rdot = m_r0dot + f(m_r0[n], m_z0)*m_const_deltat;
point_prev.r = m_r0[n] + f(m_r0[n], m_z0)*m_const_deltat;
point_prev.zdot = m_z0dot*0.00000001 + g(m_r0[n], m_z0);
point_prev.z = m_z0 + g(m_r0[n], m_z0)*m_const_deltat;
for(i=0; i<5000000; i++)
{
point.rdot = point_prev.rdot + f(point_prev.r, point_prev.z)*m_const_deltat;
point.zdot = point_prev.zdot + g(point_prev.r, point_prev.z)*m_const_deltat;
point.r = point_prev.r + point_prev.rdot*m_const_deltat;
point.z = point_prev.z + point_prev.zdot*m_const_deltat;
ii = i%100000;
if(ii == 0)
{
MoveToEx(memdc,x,y,NULL);
x=(int)(wnd_x-m_la+point.z);
y=wnd_y+point.r;
LineTo(memdc,x,y);
//Ellipse(memdc,x-2,y-2,x+2,y+2);
MoveToEx(memdc,x1,y1,NULL);
x1=(int)(wnd_x-m_la+point.z);
y1=wnd_y-point.r;
LineTo(memdc,x1,y1);
ii = 0;
InvalidateRect(hwnd,NULL,0);
}
if ((point.r<1)&&(!focusfound)) {focus[n]=point.z;focusfound=1;}
point_prev = point;
}
}
CalculateAll()
{
int i;
double foc_res=0;
char tmp[10];
for(i=0; i<m_r0count; i++)
{
Calculate(i);
if (m_r0[i]!=0) {foc_res+=focus[i];focused++;}
}
sprintf (tmp,"%g",foc_res/focused);
TextOut(memdc,10,10,tmp,strlen(tmp));
InvalidateRect(hwnd,NULL,0);
m_bCalculated = TRUE;
}
DrawLens()
{
MoveToEx(memdc,wnd_x + (int)m_la, wnd_y - (int)m_lb,NULL);
LineTo(memdc,wnd_x + (int)m_la, wnd_y - (int)m_lb - 50);
MoveToEx(memdc,wnd_x - (int)m_la, wnd_y - (int)m_lb,NULL);
LineTo(memdc,wnd_x - (int)m_la, wnd_y - (int)m_lb - 50);
MoveToEx(memdc,wnd_x + (int)m_la, wnd_y + (int)m_lb,NULL);
LineTo(memdc,wnd_x + (int)m_la, wnd_y + (int)m_lb + 50);
MoveToEx(memdc,wnd_x - (int)m_la, wnd_y + (int)m_lb,NULL);
LineTo(memdc,wnd_x - (int)m_la, wnd_y + (int)m_lb + 50);
return 0;
}
DWORD WINAPI ThreadProc( LPVOID lpParameter)
{
CalculateAll();
return 0;
}