Разработка функций, рисующих на экране незакрашенный или закрашенный параллелограмм и два вложенных один в другой параллелограмма, внешний из которых закрашен (Лабораторная работа № 1), страница 2

 line (x[3],y[3],x[4],y[4]);

 line (x[4],y[4],x[1],y[1]);

 chkbndscr();

}

void ParalShort()

{

 line (x[1],y[1],x[2],y[2]);

 line (x[2],y[2],x[3],y[3]);

 line (x[3],y[3],x[4],y[4]);

 line (x[4],y[4],x[1],y[1]);

}

int GoodIns()

{

 float S, S1=0, a,b,c,p,sin;

 int i,j, flag;

 a=sqrt(pow((x[4]-x[1]),2)+pow((y[4]-y[1]),2));

 b=sqrt(pow((x[2]-x[1]),2)+pow((y[2]-y[1]),2));

 sin=sqrt(1-pow((abs((x[4]-x[1])*(x[2]-x[1])+(y[4]-y[1])*(y[2]-y[1]))/a/b),2));

 S=sin*a*b;

 flag=0;

 for (j=1;j<5;j++)

 {

  for (i=5;i<8;i++)

  {

   if (i<8)

    {

     a=sqrt(pow((x[i]-x[i+1]),2)+pow((y[i]-y[i+1]),2));

     b=sqrt(pow((x[i]-x[j]),2)+pow((y[i]-y[j]),2));

     c=sqrt(pow((x[i+1]-x[j]),2)+pow((y[i+1]-y[j]),2));

    }

   else

    {

     a=sqrt(pow((x[5]-x[8]),2)+pow((y[5]-y[8]),2));

     b=sqrt(pow((x[5]-x[j]),2)+pow((y[5]-y[j]),2));

     c=sqrt(pow((x[8]-x[j]),2)+pow((y[8]-y[j]),2));

    }

   p=(a+b+c)/2;

   S1=S1+sqrt(p*(p-a)*(p-b)*(p-c));

  }

 if (S<S1) {flag=1;}

 S1=0;

 }

if (flag==1) return 0;

else return 1;

}

void colorParal()

{

 int tl;

 tl=typeLine; //zapomnili real type

 typeLine=0;  //sdelali type splo6nim

 Parallelogram();

 setfillstyle(typeFill,colorFill);

 floodfill((x[1]+x[3])/2,(y[1]+y[3])/2,colorLine); //zalili parm

 setcolor(0);

 setlinestyle(0,0,fatLine);

 ParalShort(); //granica 4ernaya

 setcolor(colorLine);

 typeLine=tl;

 setlinestyle(typeLine,0,fatLine);

 ParalShort(); //granica nuzhnaya

}

void cutParal()

{

 colorParal();

 printf("Please Enter the coordinates (x,y) of the paral which is supposed to be in ");

 scanf("%d%d%d%d%d%d", &x[5],&y[5],&x[6],&y[6],&x[7],&y[7]);

 setlinestyle (0,0,fatLine);

 x[8]=x[5]+x[7]-x[6];

 y[8]=y[5]+y[7]-y[6];

 setcolor(colorLine);

 line (x[5],y[5],x[6],y[6]);

 line (x[6],y[6],x[7],y[7]);

 line (x[7],y[7],x[8],y[8]);

 line (x[8],y[8],x[5],y[5]);

 if (!GoodIns())

  {

   setcolor(4);

   settextstyle(2,0,6);

   outtextxy (150,100,"Error!!! Second Paral does not belong to the First one!");

  }

 else

  {

   setfillstyle(1,0);

   floodfill((x[5]+x[7])/2,(y[5]+y[7])/2,colorLine);

  }

}

void Options()

{

 int i;

 do

 {

 printf ("LINE:\n 1 - Fat\n 2 - Type\n 3 - Color \n\nFILL:\n 4 - Type\n 5 - Color\n\n 0 - Back\n");

 scanf ("%d",&i);

 if (i>0) printf ("Please Enter - ");

 switch (i)

 {

  case 1: scanf ("%d",&fatLine); break;

  case 2: scanf ("%d",&typeLine); break;

  case 3: scanf ("%d",&colorLine); break;

  case 4: scanf ("%d",&typeFill); break;

  case 5: scanf ("%d",&colorFill); break;

  case 0: break;

 }

 }while (i>0);

}

void Menu()

{

 int i;

 do

 {

 printf ("Please enter:\n1 - Parallelogram\n2 - ColorParal\n3 - CutParal\n\n4 - GraphicOptions\n\n0 - EXIT\n");

 scanf ("%d",&i);

 switch (i)

 {

  case 1: setgraphmode(gmode); Parallelogram(); break;

  case 2: setgraphmode(gmode); colorParal(); break;

  case 3: setgraphmode(gmode);  cutParal(); break;

  case 4: restorecrtmode();     Options(); break;

  default: break;

 }

 if (i>4) getch();

 }

 while (i>0);

}

void main()

{int gdriver = DETECT, errorcode;

 initgraph(&gdriver, &gmode, "D:\\TurboC\\bgi");

 errorcode = graphresult();

 if (errorcode != grOk)

 {

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

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

    getch();

    exit(1);

 }

 Menu();

 closegraph();

}

5. Набор тестов

Введенные данные:

координаты (x,y) трех точек;

Результат

1

 200 250  250 200 400 200

Пустой параллелограмм

2

200 500 250 200 400 200

Пустой параллелограмм, вышедший за границу экрана, сообщение об ошибке

3

200 300 250 200 400 200

205 295 255 205 395 205

Два вложенных параллелограмма

4

200 250  250 200 400 200

Залитый параллелограмм

5

200 300 250 200 400 200

100 295 255 205 395 205

Два невложенных параллелограмма и сообщение об ошибке