#include #include #include #include using namespace std; struct Point{ double x,y; }; class Shape { public: vector arc; char ID; /* Поля и методы */ virtual double GetArea(){return 0;}//Вычисление площади фигуры virtual void CreateShape(){} virtual void move(){} virtual void rotate(){} virtual ~Shape(){} }; class Rectangle : public Shape { public: Rectangle () { ID='R'; arc.resize(4); } void CreateShape() { cout<<"Input 2 Rectangle coordinate points"<>arc[0].x; /*вводим все координаты*/ cin>>arc[0].y; cin>>arc[3].x; cin>>arc[3].y; arc[1].x = arc[3].x; arc[1].y = arc[0].y; arc[2].x = arc[0].x; arc[2].y = arc[3].y; } void move(double step, double angle) { for(int i=0; i<4; i++) { arc[i].x+=step*cos(angle); arc[i].y+=step*sin(angle); } } void rotate(Point point, double angle) { double *ort = new double[3]; double *fi = new double[3]; for(int i=0; i<4; i++) { double newX = arc[i].x-point.x; double newY = arc[i].y-point.y; ort[i] = sqrt(newX*newX+newY*newY); if(newX>0 && newY>=0) fi[i] = atan(newY/newX); if(newX>0 && newY<0) fi[i] = atan(newY/newX)+2*M_PI; if(newX<0) fi[i] = atan(newY/newX)+M_PI; if(newX==0 && newY>0) fi[i] = M_PI/2; if(newX==0 && newY<0) fi[i] = 3*M_PI/2; if(newX==0 && newY==0) fi[i] = 0; fi[i]+=angle; arc[i].x = point.x+ort[i]*cos(fi[i]); arc[i].y = point.y+ort[i]*sin(fi[i]); } } double GetArea() { /*вычисление конкретной площади*/return abs((arc[0].x-arc[3].x)*(arc[0].y-arc[3].y)); } ~Rectangle(){} }; class Triangle : public Shape { public: Triangle () { arc.resize(3); ID='T'; } void CreateShape() { cout<<"Input Triangle coordinate points"<>arc[i].x; /*вводим все координаты*/ cin>>arc[i].y; } } void rotate(Point point, double angle) { double *ort = new double[3]; double *fi = new double[3]; for(int i=0; i<3; i++) { double newX = arc[i].x-point.x; double newY = arc[i].y-point.y; ort[i] = sqrt(newX*newX+newY*newY); if(newX>0 && newY>=0) fi[i] = atan(newY/newX); if(newX>0 && newY<0) fi[i] = atan(newY/newX)+2*M_PI; if(newX<0) fi[i] = atan(newY/newX)+M_PI; if(newX==0 && newY>0) fi[i] = M_PI/2; if(newX==0 && newY<0) fi[i] = 3*M_PI/2; if(newX==0 && newY==0) fi[i] = 0; fi[i]+=angle; arc[i].x = point.x+ort[i]*cos(fi[i]); arc[i].y = point.y+ort[i]*sin(fi[i]); } } void move(double step, double angle) { for(int i=0; i<3; i++) { arc[i].x+=step*cos(angle); arc[i].y+=step*sin(angle); } } double GetArea() { /*вычисление конкретной площади*/ return abs(arc[0].x*(arc[1].y-arc[2].y)+arc[1].x*(arc[2].y-arc[0].y)+arc[2].x*(arc[0].y-arc[1].y))/2; } ~Triangle(){} }; class Octagon : public Shape { public: Octagon(){arc.resize(8); ID='O';} void CreateShape(){/*...*/} /* .....*/ double GetArea(){/*вычисление конкретной площади*/return 8;} void move(){} void rotate(){} ~Octagon(){} }; class Square : public Shape { public: Square(){arc.resize(4); ID='S';} void CreateShape(){/*...*/} /* .....*/ double GetArea(){/*вычисление конкретной площади*/return 8;} void move(){} void rotate(){} ~Square(){} }; class Parallelogram : public Shape { public: Parallelogram(){arc.resize(4); ID='P';} void CreateShape(){/*...*/} /* .....*/ double GetArea(){/*вычисление конкретной площади*/return 8;} void move(){} void rotate(){} ~Parallelogram(){} }; class trapeze : public Shape { public: trapeze(){arc.resize(4); ID='t';} void CreateShape(){/*...*/} /* .....*/ double GetArea(){/*вычисление конкретной площади*/return 8;} void move(){} void rotate(){} ~trapeze(){} }; class hexagon : public Shape { public: hexagon(){arc.resize(6); ID='h';} void CreateShape(){/*...*/} /* .....*/ double GetArea(){/*вычисление конкретной площади*/return 8;} void move(){} void rotate(){} ~hexagon(){} }; class Operation { //Класс, инкапсулирующий методы обработки всех объектов иерархии public: void Compare(Shape* s1, Shape* s2) {// Проверка правильности подбора типов фигур if ((s1->ID=='T' && s2->ID=='R')||(s2->ID=='T' && s1->ID=='R')) cout<<"Correct choice"<GetArea()> s2->GetArea()) cout<<"Area "<ID<<" > "<ID<GetArea()==s2->GetArea()) cout<<"Area "<ID<<" = "<ID<GetArea()< s2->GetArea()) cout<<"Area "<ID<<" < "<ID<ID<>cond; } p1->CreateShape(); cout<<"Input 2-d shape"<ID<>cond; } p2->CreateShape(); Operation op; op.Compare(p1,p2); //Сравниваем площади if(p1) delete p1; if(p2) delete p2; return 0; }