Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
06.05.2013
Размер:
11.91 Кб
Скачать
#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;
}
Соседние файлы в папке уФБМП