Скачиваний:
15
Добавлен:
01.05.2014
Размер:
4.66 Кб
Скачать
#ifndef IIItrianglecppIII
#define IIItrianglecppIII
#include "l1c2trgl.h"

cTriangle::~cTriangle(){};

void cTriangle::Set(const int i, const cPoint& F)
{
 Tr.tobegin();
 int k;
 for (k=1;k<=i-1;k++)
  Tr.move();
 Tr.del();
 Tr.add(F);
}

void cTriangle::Set(cTriangle &F)
{
 int k;
 Tr.del();
 Tr.del();
 Tr.del();
 cPoint P;
 for (k=1;k<=3;k++)
  {
   P.SetXY(F.GetX(k),F.GetY(k));
   Set(k,P);
  };
}

float cTriangle::GetX(const int i)
{
 int k;
 Tr.tobegin();
 for (k=1;k<=i-1;k++)
  Tr.move();
 cPoint P;
 Tr.GetInf(P);
 return P.GetX();
}

float cTriangle::GetY(const int i)
{
 int k;
 Tr.tobegin();
 for (k=1;k<=i-1;k++)
  Tr.move();
 cPoint P;
 Tr.GetInf(P);
 return P.GetY();
}

int cTriangle::rb()
{
 float X1,X2,X3,Y1,Y2,Y3,a,b,c;
 X1 = GetX(1);
 X2 = GetX(2);
 X3 = GetX(3);
 Y1 = GetY(1);
 Y2 = GetY(2);
 Y3 = GetY(3);
 a = (X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1);
 b = (X3-X2)*(X3-X2)+(Y3-Y2)*(Y3-Y2);
 c = (X3-X1)*(X3-X1)+(Y3-Y1)*(Y3-Y1);
 return ((fabs(a-b)<0.01)||(fabs(a-c)<0.01)||(fabs(c-b)<0.01));
};

int cTriangle::correct()
 {
  float X1,X2,X3,Y1,Y2,Y3,a,b,c;
 X1 = GetX(1);
 X2 = GetX(2);
 X3 = GetX(3);
 Y1 = GetY(1);
 Y2 = GetY(2);
 Y3 = GetY(3);
 a = sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1));
 b = sqrt((X3-X2)*(X3-X2)+(Y3-Y2)*(Y3-Y2));
 c = sqrt((X3-X1)*(X3-X1)+(Y3-Y1)*(Y3-Y1));
 return !(((fabs(a-b-c)<0.01)||(fabs(b-c-a)<0.01)||(fabs(c-b-a)<0.01)));
 };

cTriangle::cTriangle(const cPoint P1,const cPoint P2,const cPoint P3)
{
 Tr.add(P1);
 Tr.add(P2);
 Tr.add(P3);
 if (!(rb() && correct()))
  {
    Tr.del();
    Tr.del();
    Tr.del();
    cPoint P4(0,0),P5(1,0),P6(0,1);
    Tr.add(P4);
    Tr.add(P5);
    Tr.add(P6);
  };
}

cTriangle::cTriangle()
{
 cPoint P1(0,0),P2(1,0),P3(0,1);
 Tr.add(P1);
 Tr.add(P2);
 Tr.add(P3);
}

void cTriangle::move(const float dx,const float dy)
 {
  Tr.tobegin();
  int k;
  cPoint P;
  for (k=0;k<3;k++)
   {
    Tr.GetInf(P);
    P.Move(dx,dy);
    Tr.SetInf(P);
    Tr.move();
   };
 if (!(rb() && correct()))
  {
   cout<<endl<<"incorrect conditions!";
   getch();
   exit(1);
  };
 };

void cTriangle::rotate(const float x0,const float y0,const float al)
 {
  Tr.tobegin();
  int k;
  cPoint P;
  for (k=0;k<3;k++)
   {
    Tr.GetInf(P);
    P.Rotate(x0,y0,al);
    Tr.SetInf(P);
    Tr.move();
   };
  if (!(rb() && correct()))
  {
   cout<<endl<<"incorrect conditions!";
   getch();
   exit(1);
  };
 };

void cTriangle::scale(const float coef)
 {
  Tr.tobegin();
  int k;
  cPoint P;
  for (k=0;k<3;k++)
   {
    Tr.GetInf(P);
    P.SetXY(coef * P.GetX(),coef * P.GetY());
    Tr.SetInf(P);
    Tr.move();
   };
  if (!(rb() && correct()))
  {
   cout<<endl<<"incorrect conditions!";
   getch();
   exit(1);
  };
 };
/*
void cTriangle::Center(double &X,double &Y)
{
 double x0,y0,x1,y1,x2,y2,xh,yh;
 x0=GetX(1);
 y0=GetY(1);
 x1=GetX(2);
 y1=GetY(2);
 x2=GetX(3);
 y2=GetY(3);
 float a,b,c;
 a=(x0-x1)*(x0-x1)+(y0-y1)*(y0-y1);
 b=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
 c=(x0-x2)*(x0-x2)+(y0-y2)*(y0-y2);
 if (fabs(a-c) <= 0.01)
  {
   xh = (x1 + x2) / 2;
   yh = (y1 + y2) / 2;
   X = (x0 + 2 * xh) / 3;
   Y = (y0 + 2 * yh) / 3;
  }
 else
  {
   if (fabs(a-b) <= 0.01)
    {
     xh = (x0 + x2) / 2;
     yh = (y0 + y2) / 2;
     X = (x1 + 2 * xh) / 3;
     Y = (y1 + 2 * yh) / 3;
    }
   else
    {
     xh = (x0 + x1) / 2;
     yh = (y0 + y1) / 2;
     X = (x2 + 2 * xh) / 3;
     Y = (y2 + 2 * yh) / 3;
    }
  }
}

void cTriangle::Draw()
{
 int gdriver = DETECT, gmode;
 initgraph(&gdriver, &gmode, "");
 double Xm,Ym;
 Xm = getmaxx() / 2;
 Ym = getmaxy() / 2;
 double x0,y0;
 Center(x0,y0);
 double sccoef = Xm / (4 * sqrt(x0*x0+y0*y0));
 cTriangle bTr;
 int i;
 cPoint F;
 for (i=1;i<=3;i++)
  {
   F.SetXY(GetX(i)*sccoef+Xm,Ym-GetY(i)*sccoef);
   bTr.Set(i,F);
  };
 setcolor(BLUE);
 line(bTr.GetX(1),bTr.GetY(1),bTr.GetX(2),bTr.GetY(2));
 line(bTr.GetX(2),bTr.GetY(2),bTr.GetX(3),bTr.GetY(3));
 line(bTr.GetX(1),bTr.GetY(1),bTr.GetX(3),bTr.GetY(3));
 setcolor(WHITE);
 line(Xm-10,Ym,Xm+10,Ym);
 line(Xm,Ym-10,Xm,Ym+10);
 setcolor(RED);
 Out();
 line(Xm-sccoef,Ym-sccoef,Xm-sccoef,Ym+sccoef);
 line(Xm+sccoef,Ym-sccoef,Xm+sccoef,Ym+sccoef);
 line(Xm-sccoef,Ym-sccoef,Xm+sccoef,Ym-sccoef);
 line(Xm-sccoef,Ym+sccoef,Xm+sccoef,Ym+sccoef);
 getch();
 closegraph();
}
*/


void cTriangle::Out()
{
 Tr.tobegin();
 cPoint F;
 int k;
 for (k=1;k<4;k++)
  {
   Tr.GetInf(F);
   F.Out();
   cout<<" ";
   Tr.move();
  };
 cout<<endl;
};

#endif
Соседние файлы в папке Лабораторная работа 22