//Bartosz Dobrzycki, Patryk Kałużny, III rok Fizyki bis
//wersja robocza

#include <windows.h>
#include <math.h>

double omega = 0.0;  //prędkość kątowa;
double g = 9.81;     //przyspieszenie ziemskie;
double r = 2.0;      //długosc wahadła;
double teta  = 2.35; //135 stopni (1 radian = 57.29 stopnia); kąt wahadła
double dt = 0.02;    //przyrost czasu;
double x;            //wsp. x-owa końca wahadła;
double y;			 //wsp. y-owa końca wahadła;
int const radius = 30; //promień wahadła
int uTimer;			 //numer timera

int xp = 419; // wsp. x wahadła na ekranie
int yp = 187; // wsp. y wahadła na ekranie


LRESULT CALLBACK WindowProc(             
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);				  //deklaracja zapowiadajaca

int APIENTRY WinMain(HINSTANCE hInstance,     
					 HINSTANCE hPrevInstance, 
					 LPTSTR lpCmdLine,        
					 int nCmdShow)			  
{
	WNDCLASSEX wc = {0};                  
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;    //odświerzanie okna podczas rozciągania
	wc.lpfnWndProc = WindowProc;
	wc.hInstance = hInstance;
	wc.lpszClassName = "Bartosz";          //nazwa klasy okien, identyfikator wszystkich okien
	wc.hCursor = LoadCursor(0, IDC_CROSS); //kursor
	wc.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);  //pędzel tła
	RegisterClassEx(&wc);                  //rejestrowanie okna

	HWND hwnd = CreateWindowEx(0, "Bartosz", "API_Pendulum, Patryk Kałużny, Bartosz Dobrzycki", 
								WS_OVERLAPPEDWINDOW, 10, 10, 500, 500, 0, 0,
								hInstance, 0);

	if(hwnd == 0) //nie mamy uchwytu do okna
	{
		MessageBox(0, "Funkcja CreateWindowEx nie zadzialala.", "uwaga", MB_ICONSTOP);
    }

	ShowWindow(hwnd, SW_SHOW);  //rysowanie okna
	MSG msg;      // zmienna komunikatów
	while(GetMessage(&msg, 0, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;

}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //procedura okna   
{
	switch(uMsg)
	{
		case WM_CREATE: 
		{
			
			uTimer = SetTimer(hwnd, 1, 40, NULL); //tworzenie timera
			break; 
		}
		case WM_PAINT:   //odświerzanie zawartość okineka
		{
				
			PAINTSTRUCT ps; 
			HDC hdc = BeginPaint(hwnd, &ps); //uchwyt do kontekstu urządzenia
			Ellipse(hdc, xp, yp, xp + radius, yp + radius); //rysuje elipsę
			EndPaint(hwnd, &ps); //kończy rysowanie
			break;
		}
		case WM_DESTROY:
		{
			PostQuitMessage(0); //przerywa pętlę po zamknieciu okna
			if (uTimer) KillTimer(hwnd, uTimer);  //niszczy timer
			return 0;
		}
		case WM_TIMER:  //obsługa timera
		{
			//rozwiązanie równania różniczkowego metodą Eulera
			omega = omega + (g/r) * sin(teta) * dt;		
			teta = teta + omega * dt;
			x = r*sin(teta) ;  
			y = r*cos(teta) ;
			
			//przeliczenie współrzędnych do wyświetlania na ekranie
			xp = (int)(x * 133 + 230);
			yp = (int)(y * (-133));
			
			InvalidateRect(hwnd,NULL,false); //wstawienie komunikatu WM_PAINT do kolejki
			break;
		}
		default: 
		{
			return DefWindowProc(hwnd, uMsg, wParam,lParam); 
		}
	}
}
