Написание программы с использованием ООП, которая рисует треугольник произвольной формы, страница 2

xr=(int)((x1-xm)*cos(a)-(y1-ym)*sin(a)+xm);

yr=(int)((x1-xm)*sin(a)+(y1-ym)*cos(a)+ym);

x1=xr;y1=yr;

xr=(int)((x2-xm)*cos(a)-(y2-ym)*sin(a)+xm);

yr=(int)((x2-xm)*sin(a)+(y2-ym)*cos(a)+ym);

x2=xr;y2=yr;

xr=(int)((x3-xm)*cos(a)-(y3-ym)*sin(a)+xm);

yr=(int)((x3-xm)*sin(a)+(y3-ym)*cos(a)+ym);

x3=xr;y3=yr;

Show();}

if((e==18432)||(e==19712)){

Hide();

xr=(int)((x1-xm)*cos(-a)-(y1-ym)*sin(-a)+xm);

yr=(int)((x1-xm)*sin(-a)+(y1-ym)*cos(-a)+ym);

x1=xr;y1=yr;

xr=(int)((x2-xm)*cos(-a)-(y2-ym)*sin(-a)+xm);

yr=(int)((x2-xm)*sin(-a)+(y2-ym)*cos(-a)+ym);

x2=xr;y2=yr;

xr=(int)((x3-xm)*cos(-a)-(y3-ym)*sin(-a)+xm);

yr=(int)((x3-xm)*sin(-a)+(y3-ym)*cos(-a)+ym);

x3=xr;y3=yr;

Show();}

}while(e!=283);

};

void Triang::ChangeColor()

{

int www;

do{

color++;

if(color==9)color+=1;

if(color==16)color=1;

Show();}while(bioskey(0)!=283);

};

void Triang::MoveF(){

int xx,yy,q;

do{

q=bioskey(0);

if ((q==18432)&&(ym>10))  {yy=ym-10;MoveTo(xm,yy);}

if ((q==20480)&&(ym<440)) {yy=ym+10;MoveTo(xm,yy);}

if ((q==19712)&&(xm<630)) {xx=xm+10;MoveTo(xx,ym);}

if ((q==19200)&&(xm>10))  {xx=xm-10;MoveTo(xx,ym);}

}while(q!=283);

};

void Triang::MoveT(){

int s,www,yy,xx;

q:s=bioskey(0);

if (s==561) goto t1;

if (s==818) goto t2;

if (s==1075) goto t3;

if (s==283) goto ccc; else goto q;

t1: s=bioskey(0);

if ((s==18432)) {yy=y1-10;MoveTo1(x1,yy);}

if ((s==20480)) {yy=y1+10;MoveTo1(x1,yy);}

if ((s==19712)) {xx=x1+10;MoveTo1(xx,y1);}

if ((s==19200)) {xx=x1-10;MoveTo1(xx,y1);}

if (s==283) goto q;

goto t1;

t2: s=bioskey(0);

if ((s==18432)) {yy=y2-10;MoveTo2(x2,yy);}

if ((s==20480)) {yy=y2+10;MoveTo2(x2,yy);}

if ((s==19712)) {xx=x2+10;MoveTo2(xx,y2);}

if ((s==19200)) {xx=x2-10;MoveTo2(xx,y2);}

if (s==283) goto q;

goto t2;

t3: s=bioskey(0);

if ((s==18432)) {yy=y3-10;MoveTo3(x3,yy);}

if ((s==20480)) {yy=y3+10;MoveTo3(x3,yy);}

if ((s==19712)) {xx=x3+10;MoveTo3(xx,y3);}

if ((s==19200)) {xx=x3-10;MoveTo3(xx,y3);}

if (s==283) goto q;

goto t3;

ccc:;

}

/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////

void Init()

{

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode, "E:\\borlandc\\bgi");

errorcode = graphresult();

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1);

}

};

void skin(){

setbkcolor(LIGHTBLUE);

setcolor(8);

rectangle(10,10,getmaxx()-10,getmaxy()-40);

rectangle(0,0,getmaxx(),getmaxy());

setfillstyle(SOLID_FILL,7);

floodfill(3,3,8);

setcolor(4);

outtextxy(100,2,"Управление производится клавишами курсора");

outtextxy(10,getmaxy()-35,"Перемещение фигуры  -  F1");

outtextxy(10,getmaxy()-15,"Вращение фигуры - F2");

outtextxy(250,getmaxy()-35,"Перемещение вершин - F3");

outtextxy(470,getmaxy()-35,"Выбор цвета - F4");

outtextxy(470,getmaxy()-15,"Выход - Esc");

setcolor(4);

circle(260,getmaxy()-15,1);

outtextxy(260,getmaxy()-18," - 1");

setcolor(13);

circle(320,getmaxy()-15,1);

outtextxy(320,getmaxy()-18," - 2");

setcolor(1);

circle(380,getmaxy()-15,1);

outtextxy(380,getmaxy()-18," - 3");

setviewport(11,11,629,439,1);

};

void main()

{Init();

skin();

Triang tr(200,200,300,200,200,300,15);

tr.Show();

s:switch (bioskey(0)) {

case 15104 : {tr.MoveF();       break;}    //f1

case 15360 : {tr.RotateTo(0.5);break;}    //f2

case 15616 : {tr.MoveT();       break;}    //f3

case 15872 : {tr.ChangeColor();break;}

case 283   : {closegraph();exit(-1);}

default : goto s;};

goto s;

}

5.  Математическая модель.

В этом пункте стоит упомянуть лишь вращение точки (x,y) вокруг точки с координатами (a,b) на угол j.

x`=(x-a)*cos(j)-(y-b)*sin(j)+a

y`=(x-a)*sin(j)+(y-b)*cos(j)+b