Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
//а бб¬ ваЁў Ґ¬ ¤ўЁ¦ҐЁҐ Ё ¤Ґд®а¬ жЁо дЁЈга ў 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();
}