Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / Labs 2004 / Labor3 / Surfaces / ROTATION

.CPP
Скачиваний:
27
Добавлен:
16.04.2013
Размер:
8.17 Кб
Скачать
//бва®Ё¬ Їа®бва ­б⢥­­го н«Ґ¬Ґ­в а­го ЄаЁўго ЃҐ§мҐ


#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <math.h>
#include <stdio.h>


//Ё­вҐа䥩б
//Ё¬п Є« бб  ®Є­ 
char const szClassName[] = "LineClass";
//§ Ј®«®ў®Є ®Є­ 
char const szWindowTitle[] = "Bizer - line,               rotation by mouse and keyboard (arrows)";


//Їа®в®вЁЇл дг­ЄжЁ©
BOOL RegisterApp(HINSTANCE hInst);
HWND CreateApp(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Line_OnCreate(HWND);
void Line_OnDestroy(HWND);
void Line_OnPaint(HWND);


//ѓ« ў­ п дг­ЄжЁп - в®зЄ  ўе®¤  ў Їа®Ја ¬¬г
#pragma argsused
int PASCAL WinMain(HINSTANCE hInst,
						 HINSTANCE hPrevInstance,
						 LPSTR     lpszCmdParam,
						 int       nCmdShow)
{
	MSG msg;

	if(!RegisterApp(hInst))  //ॣЁбва жЁп ЇаЁ«®¦Ґ­Ёп
		return FALSE;

	if(!CreateApp(hInst,nCmdShow))  //ᮧ¤ ­ЁҐ ®Є­  ЇаЁ«®¦Ґ­Ёп
		return FALSE;

	while(GetMessage(&msg,NULL,0,0))   //жЁЄ« ®Ўа Ў®вЄЁ б®®ЎйҐ­Ё©
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

//ђҐЈЁбва жЁп Є« бб  ®Є­ 
BOOL RegisterApp(HINSTANCE hInst)
{
	WNDCLASS wc;

	wc.style         = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc   = WndProc;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hInst;
	wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor		  = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = GetStockBrush(GRAY_BRUSH);
	wc.lpszMenuName  = "APP_MENU";
	wc.lpszClassName = szClassName;

	return RegisterClass(&wc);
}



//‘®§¤ ­ЁҐ ®Є­  ЇаЁ«®¦Ґ­Ёп
HWND CreateApp(HINSTANCE hInstance, int nCmdShow)
{
	 HWND hwnd;

	 hwnd = CreateWindow(szClassName,
									 szWindowTitle,
									 WS_OVERLAPPEDWINDOW,
									 CW_USEDEFAULT, //x -Є®®а¤Ё­ в  ®Є­ 
									 CW_USEDEFAULT, //y -Є®®а¤Ё­ в  ®Є­ 
									 CW_USEDEFAULT, //иЁаЁ­  ®Є­ 
									 CW_USEDEFAULT, //ўлб®в  ®Є­ 
									 NULL,
									 NULL,
									 hInstance,
									 NULL);

	if(hwnd == NULL)
		return hwnd;

	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);

	return hwnd;
}


double fi,teta,sf,cf,st,ct;
int kluch, xma0,xma,yma,yma0, xma1,yma1;

//®Є®­­ п Їа®жҐ¤га , ®Ўа Ў влў ой п б®®ЎйҐ­Ёп
LRESULT CALLBACK  WndProc(HWND hwnd, UINT msg,
											WPARAM wParam, LPARAM lParam)
{

	switch(msg)
	{
		case WM_CREATE:
			Line_OnCreate(hwnd);
			break;
		case WM_PAINT:
			Line_OnPaint(hwnd);
			break;

		case WM_LBUTTONDOWN:
				if(kluch == 0)
				{
				xma1 = LOWORD(lParam);
				yma1 = HIWORD(lParam);
				}
			kluch = 1;
			break;

		case WM_LBUTTONUP:
			kluch = 0;
			break;


		case WM_MOUSEMOVE:
			  if(kluch == 1)
			  {
				xma = LOWORD(lParam);
				yma = HIWORD(lParam);


				fi += xma-xma1;
				teta += yma-yma1;
				xma1 = xma; yma1 = yma;
		InvalidateRect(hwnd,NULL,TRUE);
				}
				break;
		case WM_KEYDOWN:
			switch(wParam)
			{
				case VK_LEFT:
				fi += 15;
	InvalidateRect(hwnd,NULL,TRUE);
				break;
				case VK_RIGHT:
				fi -= 15;
	InvalidateRect(hwnd,NULL,TRUE);
				break;
				case VK_UP:
				teta += 15;
	InvalidateRect(hwnd,NULL,TRUE);
				break;
				case VK_DOWN:
				teta -= 15;
	InvalidateRect(hwnd,NULL,TRUE);
				break;
			}
			break;
		case WM_DESTROY:
			Line_OnDestroy(hwnd);
			break;
		default:
			return DefWindowProc(hwnd,msg,wParam,lParam);
	}

	return 0L;

}


void Line_OnCreate(HWND hwnd)
{
	fi = 30; teta = 60;
}



#pragma argsused
void Line_OnDestroy(HWND hwnd)
{
	PostQuitMessage(0);   //§ Єалў Ґ¬ ®Є­®
}




double Px[4], Py[4], Pz[4];


double Bezie(int i, double t)  //зҐвлॠдг­ЄжЁЁ ЃҐа­и⥩­ 
{
	double b;
	switch(i)
	{
	  case 0  : b=(1-t)*(1-t)*(1-t); break;
	  case 1  : b=3*t*(1-t)*(1-t);   break;
	  case 2  : b=3*t*t*(1-t);       break;
	  case 3  : b=t*t*t;             break;
	}
	return b;
}


double splineX(double t)
{
  double S=0;
  for(int i=0; i<4; i++)
	 S += Px[i]*Bezie(i,t);
  return S;
}

double splineY(double t)
{
  double S=0;
  for(int i=0; i<4; i++)
	 S += Py[i]*Bezie(i,t);
  return S;
}


double splineZ(double t)
{
  double S=0;
  for(int i=0; i<4; i++)
	 S += Pz[i]*Bezie(i,t);
  return S;
}



//ЇҐаҐе®¤ ў ўЁ¤®ўго бЁб⥬㠪®®а¤Ё­ в Ё ®ав®Ја дЁзҐбЄ®Ґ Їа®ҐЄвЁа®ў ­ЁҐ
double Xe(double x,double y)
{
  return -sf*x+cf*y;
}

//ЇҐаҐе®¤ ў ўЁ¤®ўго бЁб⥬㠪®®а¤Ё­ в Ё ®ав®Ја дЁзҐбЄ®Ґ Їа®ҐЄвЁа®ў ­ЁҐ
double Ye(double x,double y,double z)
{
  return -ct*cf*x-ct*sf*y+st*z;
}



//ЇҐаҐў®¤ ўЁ¤®ўле Є®®а¤Ё­ в ў Є®®а¤Ё­ вл ЇЁЄбҐ«Ґ©

//Ј«®Ў «м­лҐ ЇҐаҐ¬Ґ­лҐ
double xe1, xe2, ye1, ye2;
int ne1, ne2, me1, me2;


//ЇҐаҐе®¤ ®в x Є ЇЁЄбҐ«о n
inline int xn(double x)
{
	return (int)((x - xe1)/(xe2 - xe1)*(ne2 - ne1)) + ne1;
}


//ЇҐаҐе®¤ ®в y Є ЇЁЄбҐ«о m
inline int ym(double y)
{
	return (int)((y - ye1)/(ye2 - ye1)*(me2 - me1)) + me1;
}





void Line_OnPaint(HWND hwnd)
{

	Px[0] = 1.0; Py[0] = 0; Pz[0] = 0;
	Px[1] = 0; Py[1] = 1.0; Pz[1] = 1.0;
	Px[2] = -1.0; Py[2] = 0; Pz[2] = 0.6;
	Px[3] = 0; Py[3] = -1.0; Pz[3] = 1.8;


//а §¬Ґал ®Є­  ў ¬Ёа®ўле Є®®а¤Ё­ в е Ё ў ЇЁЄбҐ«пе
	xe1 = -2; xe2 =  2; ye1 =  -2; ye2 =  2;
	ne1 = 150; ne2 = 450; me1 = 350; me2 = 50;

//¬ ЄбЁ¬ «м­лҐ ¤«Ё­л ®бҐ© -¬Ёа®ўлҐ Є®®а¤Ё­ вл
  double xmax=1.8, ymax=1.8, zmax=1.8;


  double fi1, fi2, rad;
  //Є®®а¤Ё­ вл Їа®ҐЄвЁа㥬®© в®зЄЁ
  double xe, ye;
  //Є®®а¤Ё­ вл ЇЁЄбҐ«®ў
	int x1,y1,x2,y2;


	HDC hdc;
	PAINTSTRUCT ps;

	hdc = BeginPaint(hwnd, &ps);  //Ї®«гз Ґ¬ Є®­вҐЄбв гбва®©бвў 

	HBRUSH hbrush;
	HPEN hpen;

	MoveTo(hdc,ne1,me1);
	LineTo(hdc,ne2,me1);
	LineTo(hdc,ne2,me2);
	LineTo(hdc,ne1,me2);
	LineTo(hdc,ne1,me1);


	//ўлзЁб«Ґ­ЁҐ бЁ­гб®ў Ё Є®бЁ­гб®ў ®аЁҐ­вЁа®ўЄЁ ўЁ¤®ў®© бЁбвҐ¬л Є®®а¤Ё­ в
	sf=sin(M_PI*fi/180);
	cf=cos(M_PI*fi/180);
	st=sin(M_PI*teta/180);
	ct=cos(M_PI*teta/180);


  char ss[10];
	SetBkColor(hdc,RGB(127,127,127));
	SetTextColor(hdc,RGB(0,255,127));
  sprintf(ss,"fi = %4.0lf",fi);
  TextOut(hdc,(ne1+ne2)/2-80,me2-25,ss,9);
  sprintf(ss,"teta = %4.0lf",teta);
  TextOut(hdc,(ne1+ne2)/2+20,me2-25,ss,11);



	//®ЇаҐ¤Ґ«пҐ¬ ЇҐа®: 1) бвЁ«м - бЇ«®и­®©
						 // 2) в®«йЁ­  «Ё­Ё© - 3 ЇЁЄбҐ«Ґ©
						 // 3) 梥⠫Ё­Ё© - паЄ®-¦Ґ«вл©
	hpen = CreatePen(PS_SOLID,1,RGB(0,255,255));
	SelectPen(hdc,hpen);    //ўлЎЁа Ґ¬ ЇҐа® hpen


//®бм Ox
		xe=Xe(0,0);
		ye=Ye(0,0,0);
		x1=xn(xe);
		y1=ym(ye);
		xe=Xe(xmax,0);
		ye=Ye(xmax,0,0);
		x2=xn(xe);
		y2=ym(ye);
	MoveTo(hdc,x1,y1);
	LineTo(hdc,x2,y2);

	SetBkColor(hdc,RGB(127,127,127));
	SetTextColor(hdc,RGB(255,0,127));
	TextOut(hdc,x2, y2, "X",1);

//®бм Oy
		xe=Xe(0,0);
		ye=Ye(0,0,0);
		x1=xn(xe);
		y1=ym(ye);
		xe=Xe(0,ymax);
		ye=Ye(0,ymax,0);
		x2=xn(xe);
		y2=ym(ye);
	MoveTo(hdc,x1,y1);
	LineTo(hdc,x2,y2);

	SetBkColor(hdc,RGB(127,127,127));
	SetTextColor(hdc,RGB(255,0,127));
	TextOut(hdc,x2, y2, "Y",1);


//®бм Oz
		xe=Xe(0,0);
		ye=Ye(0,0,0);
		x1=xn(xe);
		y1=ym(ye);
		xe=Xe(0,0);
		ye=Ye(0,0,zmax);
		x2=xn(xe);
		y2=ym(ye);
	MoveTo(hdc,x1,y1);
	LineTo(hdc,x2,y2);

	SetBkColor(hdc,RGB(127,127,127));
	SetTextColor(hdc,RGB(255,0,127));
	TextOut(hdc,x2, y2, "Z",1);


	//®ЇаҐ¤Ґ«пҐ¬ ЇҐа®: 1) бвЁ«м - бЇ«®и­®©
						 // 2) в®«йЁ­  «Ё­Ё© - 3 ЇЁЄбҐ«Ґ©
						 // 3) 梥⠫Ё­Ё© - паЄ®-¦Ґ«вл©
	hpen = CreatePen(PS_SOLID,1,RGB(255,255,255));
	SelectPen(hdc,hpen);    //ўлЎЁа Ґ¬ ЇҐа® hpen

		xe = Xe(Px[0],Py[0]);
		ye = Ye(Px[0],Py[0],Pz[0]);
		x1=xn(xe);
		y1=ym(ye);
		for(int k=1; k<4; k++)
		{
			xe = Xe(Px[k],Py[k]);
			ye = Ye(Px[k],Py[k],Pz[k]);
			x2 = xn(xe);
			y2 = ym(ye);
	MoveTo(hdc,x1,y1);
	LineTo(hdc,x2,y2);

			x1 = x2; y1 = y2;
		}



	int J=150;
	double xt, yt, zt, t, dt = 1.0/J;

		for(int j=0; j<J; j++)
		{
			t = dt*j;
			xt = splineX(t);
			yt = splineY(t);
			zt = splineZ(t);
			xe = Xe(xt,yt);
			ye = Ye(xt,yt,zt);
			x1 = xn(xe);
			y1 = ym(ye);
			SetPixel(hdc,x1,y1,RGB(255,255,0));
		}




	DeletePen(hpen);           //гЎЁа Ґ¬ ЇҐа® hpen


	EndPaint(hwnd, &ps);       //®бў®Ў®¦¤ Ґ¬ Є®­вҐЄбв гбва®©бвў 

}

Соседние файлы в папке Surfaces