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

Лабы / Labs 2004 / Labor_2 / MOVEDOS1

.CPP
Скачиваний:
24
Добавлен:
16.04.2013
Размер:
6.55 Кб
Скачать
//а бб¬ ваЁў Ґ¬ ¤ўЁ¦Ґ­ЁҐ Ё ¤Ґд®а¬ жЁо дЁЈга ў DOS
//ЁбЇ®«м§гҐ¬  ддЁ­­лҐ ЇаҐ®Ўа §®ў ­Ёп
//業ва дЁЈгал ¤ўЁ¦Ґвбп Ї® § ¤ ­­®© ва ҐЄв®аЁЁ
//ў ­ иҐ¬ б«гз Ґ нв® ®Єаг¦­®бвм
//§  дЁЈга ¬Ё ®бв Ґвбп б«Ґ¤

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <process.h>
#include <math.h>
#include <dos.h>
#include <bios.h>

//Є« бб ¤«п а Ў®вл б ¬ ваЁж ¬Ё  ддЁ­­ле ЇаҐ®Ўа §®ў ­Ё©
//ЁбЇ®«м§говбп ®¤­®а®¤­лҐ Є®®а¤Ё­ вл
class Matrix2D
{

public:
	double x[3][3];

	Matrix2D();                               //¬ ваЁж  Ґ¤Ё­Ёз­ п

	void rotate(double fi);                      //¬ ваЁж  Ї®ў®а®в 
	void displa(double kx, double ky);           //¬ ваЁж  а бв殮­Ёп
	void transl(double tx, double ty );          //¬ ваЁж  ва ­б«пжЁЁ

	//ЇҐаҐ¬­®¦Ґ­ЁҐ ¬ ваЁж
	friend Matrix2D operator * (const Matrix2D&, const Matrix2D&);

};

Matrix2D::Matrix2D()
{
	x[0][0] =  1; x[0][1] =  0; x[0][2] =  0;
	x[1][0] =  0; x[1][1] =  1; x[1][2] =  0;
	x[2][0] =  0; x[2][1] =  0; x[2][2] =  1;
}


void Matrix2D::rotate(double fi)
{
	double cosfi = cos(fi), sinfi = sin(fi);
	x[0][0] = cosfi; x[0][1] = -sinfi; x[0][2] = 0;
	x[1][0] = sinfi; x[1][1] =  cosfi; x[1][2] = 0;
	x[2][0] =     0; x[2][1] =      0; x[2][2] = 1;
}

void Matrix2D::displa(double kx, double ky)
{
	x[0][0] = kx; x[0][1] =  0; x[0][2] = 0;
	x[1][0] =  0; x[1][1] = ky; x[1][2] = 0;
	x[2][0] =  0; x[2][1] =  0; x[2][2] = 1;
}

void Matrix2D::transl(double tx, double ty )
{
	x[0][0] =  1; x[0][1] =  0; x[0][2] = tx;
	x[1][0] =  0; x[1][1] =  1; x[1][2] = ty;
	x[2][0] =  0; x[2][1] =  0; x[2][2] =  1;
}


Matrix2D operator * (const Matrix2D& a, const Matrix2D& b)
{
	Matrix2D c;
	double s;
	for(int i=0; i<3; i++)
		for(int j=0; j<3; j++)
		{
			s = 0;
			for(int n=0; n<3; n++)
				s += a.x[i][n]*b.x[n][j];
			c.x[i][j] = s;
		}
	return c;
}


//а §¬Ґал ®Є­  ў нЄа ­­ле Є®®а¤Ё­ в е ®в­®бЁвҐ«м­® нЄа ­ 
int winLeft, winRight, winBottom, winTop;


//а §¬Ґал Ї®«п ўлў®¤  ў ¬Ёа®ўлеҐ Є®®а¤Ё­ в е
double xLeft, xRight, yBottom, yTop;
//а §¬Ґал Ї®«п ўлў®¤  ў нЄа ­­ле Є®®а¤Ё­ в е ®в­®бЁвҐ«м­® ®Є­ 
int    nLeft, nRight, mBottom, mTop;



//ЇҐаҐе®¤ ®в x Є ЇЁЄбҐ«о n
inline int xn(double x)
{
	return (int)((x - xLeft)/(xRight - xLeft)*(nRight - nLeft)) + nLeft;
}

//ЇҐаҐе®¤ ®в y Є ЇЁЄбҐ«о m
inline int ym(double y)
{
	return (int)((y - yBottom)/(yTop - yBottom)*(mTop - mBottom)) + mBottom;
}



//ᮧ¤ Ґ¬ ®Є­® ўлў®¤ 
void CreatWindow()
{
	setfillstyle(SOLID_FILL,3);
	bar(winLeft, winTop, winRight, winBottom);

	setcolor(12);

	outtextxy(winLeft+5, winTop+7, "Korneev V");

	setcolor(15);
	outtextxy(winLeft+150, winTop+7, "Move figures to DOS");

	setcolor(15);
	rectangle(winLeft+3, winTop+17, winRight-3, winBottom-3);

	setfillstyle(SOLID_FILL,LIGHTGRAY);
	bar(winLeft+5, winTop+19, winRight-5, winBottom-5);

	setviewport(winLeft+5, winTop+19, winRight-5, winBottom-5,1);

}


//бвагЄвга  ¤«п ®ЇЁб ­Ёп в®зҐЄ дЁЈгал
struct Point
{
	double x;
	double y;
};


// ддЁ­­®Ґ ЇаҐ®Ўа §®ў ­ЁҐ Є®®а¤Ё­ в в®зЄЁ P б Ї®¬®ймо
//¬ ваЁжл A
Point affine( Matrix2D A,  Point P)
{
	Point Pp;
		Pp.x = A.x[0][0]*P.x + A.x[0][1]*P.y + A.x[0][2]*1;
		Pp.y = A.x[1][0]*P.x + A.x[1][1]*P.y + A.x[1][2]*1;
	return Pp;
}


//аЁбгҐв дЁЈгаг Ї® Є®®а¤Ё­ в ¬ ўҐаиЁ­ Pt
void viewFifure(Point *Pt)
{
	int Poly[14];
	for(int i=0; i<14; i++)
		if((i % 2) == 0)
			Poly[i] = xn(Pt[i/2].x);
		else
			Poly[i] = ym(Pt[i/2].y);

	setlinestyle(SOLID_LINE,0,1);
	setcolor(LIGHTBLUE);
	setfillstyle(1, LIGHTRED);
	fillpoly(7,Poly);
}


//дг­ЄжЁп ®бв ­ ў«Ёў Ґв ўлЇ®«­Ґ­ЁҐ Їа®Ја ¬¬л ЇаЁ ­ ¦ вЁЁ
//«оЎ®© Є« ўЁиЁ, ЇаЁ ¤ «м­Ґ©и¬ ­ ¦ вЁЁ «оЎ®© Є« ўЁиЁ
//Їа®Ја ¬¬  Їа®¤®«¦ Ґв ўлЇ®«­Ґ­ЁҐ
//ўл室 Ё§ Їа®Ја ¬¬л - Esc
void StopRunQuit()
{
  union inkey   //ў н⮬ ®ЎкҐ¤Ё­Ґ­ЁЁ еа ­Ёвбп Ё­д®а¬ жЁп ® ­ ¦ в®© Є« ўЁиҐ
  {                         //ch[0] -¬« ¤иЁ© Ў ©в (ASCII Є®¤)
	 unsigned char ch[2];    //ch[1] -бв аиЁ© Ў ©в (Є®¤ бЄ ­Ёа®ў ­Ёп Є« ўЁиЁ)
	 int i;                  //i -®ЎкҐ¤Ё­Ґ­ЁҐ ¤ўге Ў ©в ў б«®ў®
  } c;


		if(kbhit())
		{
			c.i = bioskey(0);
			if(c.ch[0] == 27 && c.ch[1] == 1)
			{
				closegraph();
				exit(0);
			}

			while(!kbhit());

			c.i = bioskey(0);
			if(c.ch[0] == 27 && c.ch[1] == 1)
			{
				closegraph();
				exit(0);
			}
		}
}



void main()
{

//а §¬Ґал ®Є­  ў нЄа ­­ле Є®®а¤Ё­ в е ®в­®бЁвҐ«м­® нЄа ­ 
	winLeft = 50; winRight = 560; winBottom = 400; winTop = 50;

//а §¬Ґал Ї®«п ўлў®¤  ў ¬Ёа®ўле Ё нЄа ­­ле Є®®а¤Ё­ в е
	xLeft = -10; xRight =  10; yBottom =  -6.52; yTop =  6.52;
	nLeft = 0; nRight  = winRight-winLeft-10;
	mTop  = 0; mBottom = winBottom-winTop-24;

//Ё­ЁжЁ «Ё§ жЁп Ја дЁзҐбЄ®© бЁб⥬л
  int mode, res, driver = DETECT;
  initgraph(&driver, &mode,"c:\\borlandc\\bgi");
  if((res = graphresult()) != grOk)
  {
	 printf("\nGraphics error: %s\n", grapherrormsg(res));
	 exit(1);
  }

	setbkcolor(15);
//ᮧ¤ Ґ¬ ®Є­® ўлў®¤ 
	CreatWindow();

//аЁб㥬 Є®®а¤Ё­ в­лҐ ®бЁ
//ўлЎ®а ЇҐа :    1) бвЁ«м - бЇ«®и­®©
				 //  2) в®«йЁ­  «Ё­Ё© - 1 ЇЁЄбҐ«п
				 //  3) 梥⠫Ё­Ё© - паЄ®-Ј®«гЎ®©
	setlinestyle(SOLID_LINE,0,1);
	setcolor(LIGHTCYAN);

	int nb, ne, mb, me;
	nb = xn(xLeft); mb = ym(0);
	ne = xn(xRight); me = ym(0);
	line(nb,mb,ne,me);

	nb = xn(0); mb = ym(yBottom);
	ne = xn(0); me = ym(yTop);
	line(nb,mb,ne,me);

//Є®®а¤Ё­вл ўҐаиЁ­ ⥫ 
	Point Pt[7] = {{1.0, 0.0}, {2.0, 0.0}, {0.0, 2.0},
			 {-2.0, 0.0}, {-1.0, 0.0}, {-1.0,-2.0}, {1.0, -2.0}};

//ᮧ¤ Ґ¬ 6 ¬ ваЁж
	Matrix2D R, T, D, A, T1, T2;

//­ з «м­ п в®зЄ  жҐ­в  дЁЈгал
	double x0 = 5, y0 = 0;

//ЇҐаҐ¤ўЁЈ Ґ¬ дЁЈгаг ў ­ з «м­го в®зЄг
	T.transl(x0,y0);
	int n;
	for(n=0; n<7; n++)
		Pt[n] = affine(T,Pt[n]);

//аЁб㥬 дЁЈгаг ў ­ з«м­®© в®зЄҐ
	viewFifure(Pt);

	double x2, y2, x1, y1;
	x1 = x0;	y1 = y0;

//§ ¤ Ґ¬ гЈ®« Ї®ў®а®в  Ё Є®нддЁжЁҐ­вл а бв殮­Ёп
	double fi = M_PI/24, kx = 0.975, ky = 0.975;

//жЁЄ« ¤ўЁ¦Ґ­Ёп Ё ¤Ґд®а¬ жЁЁ дЁЈгал
	for(int m=1; m<100; m++)
	{
		x2 = 5*cos(fi*m);
		y2 = 5*sin(fi*m);

//ᮧ¤ Ґ¬ ¬ ваЁжл  ддЁ­­®Ј® ЇаҐ®Ўа §®ў ­Ёп
		T1.transl(-x1,-y1);
		R.rotate(fi);
		D.displa(kx, ky);
		T.transl(x2-x1,y2-y1);
		T2.transl(x1,y1);

		A = T2*T*D*R*T1;

//б®ўҐаи Ґ¬  ддЁ­­®Ґ ЇаҐ®Ўа §®ў ­ЁҐ в®зҐЄ дЁЈгал
		for(int n=0; n<7; n++)
			Pt[n] = affine(A,Pt[n]);

//аЁб㥬 дЁЈгаг ў ­®ў®¬ ¬ҐбвҐ
		viewFifure(Pt);
		x1 = x2; y1 = y2;

		delay(400);
		StopRunQuit();
	}

	getch();

//ўлЄ«о祭ЁҐ Ја дЁзҐбЄ®© бЁб⥬л
	closegraph();
}
Соседние файлы в папке Labor_2