Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

класс фигур

52K
28 мая 2011 года
Gevorg
22 / / 10.04.2011
Доброго времени суток . Снова нужна помощь . Задание такое : создать абстрактный класс фигур и сделать 2 наследника (класс треугольников и прямоугольников) . Методы : нахождение площади фигуры , сравнение по площади , перемещение на заданный вектор , определение пересечения фигур и отношение включения друг в друга . В общем то прога написана , все работает , но вот не знаю , как определить включение . Если кто-то знает , подскажите плиз . Вот код :
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <fstream>
#include <math.h>

const double eps=0.0001;

using namespace std;

char bufRus[256];
char* Rus(char* mes)
{
 AnsiToOem(mes, bufRus);
 return bufRus;
}

struct point
{
       float x;
       float y;
};

class Figure
{
      protected:
      point* a;
      int n;
      Figure(void) {n=0;};
      Figure(const int &k) {n=k; a=new point [n]; for(int i=0;i<n;i++) {a.x=0; a.y=0;}};
      public:
      virtual float sqr(void) = 0;
      void print();
      void move();
      point getpoint(int);
      virtual void read()=0;
      ~Figure() {delete []a; n=0;};
};
class Triangle : public Figure
{
      public:
      Triangle(void):Figure(3) {};
      void read();
      float sqr();  
};
class Rect : public Figure
{
      public:
      Rect(void):Figure(4) {};
      void read();
      float sqr();      
};



//==================================================



bool prov(point p0,point p1,point p2,point p3);
bool pers(Figure* ob1,Figure* ob2);
int menu();



//==================================================

//==================================================



int main()
{
      Figure *f1,*f2,*f3,*f4,*f5,*f6;
      f1=new Triangle;
      f2=new Rect;
      f3=new Triangle;
      f4=new Rect;
      f5=new Triangle;
      f6=new Rect;    
                       //  нечетные фигуры - треугольники , четные - прямоугольники ;
                       // для единичных ("унарных") операций используются фигуры под номерами 5 и 6 (т.е вычисление площади,вывод на экран и т.д) ;
                       // для бинарных(например , сравнение по площади) операций ипользуются фигуры 1,3 и 2,4
                       

      while (true)
      {
      switch(menu())
       {
        case 1: cout<<Rus("Введите координаты вершин треугольника")<<endl; f5->read(); cout<<Rus("Данные приняты")<<endl; break;
        case 2: cout<<Rus("Введите координаты вершин прямоугольника")<<endl; f6->read(); cout<<Rus("Данные приняты")<<endl; break;
        case 3: cout<<"S="<<f5->sqr()<<endl; break;
        case 4: cout<<"S="<<f6->sqr()<<endl; break;
        case 5: cout<<Rus("Ввод первого треугольника")<<endl;f1->read();
                cout<<Rus("Ввод второго треугольника")<<endl;f3->read();
                if((f1->sqr())>(f3->sqr())) cout<<"S1 > S2"<<endl;
                if((f1->sqr())<(f3->sqr())) cout<<"S1 < S2"<<endl;
                if((f1->sqr())==(f3->sqr()))cout<<"S1=S2"<<endl;
                break;
        case 6: cout<<Rus("Ввод первого прямоугольника")<<endl;f2->read();
                cout<<Rus("Ввод второго прямоугольника")<<endl;f4->read();
                if((f2->sqr())>(f4->sqr())) cout<<"S1 > S2"<<endl;
                if((f2->sqr())<(f4->sqr())) cout<<"S1 < S2"<<endl;
                if((f2->sqr())==(f4->sqr()))cout<<"S1=S2"<<endl;
                break;
        case 7: if(pers(f1,f2)) {cout<<Rus("Фигуры пересекаются")<<endl;} else {cout<<Rus("Фигуры не пересекаются")<<endl;} break;
        case 8: f5->move(); cout<<Rus("Данные приняты")<<endl; break;
        case 9: f6->move(); cout<<Rus("Данные приняты")<<endl; break;
        case 10: f5->print(); cout<<Rus("Данные приняты")<<endl; break;
        case 11: f6->print(); cout<<Rus("Данные приняты")<<endl; break;
        case 12:  f1->~Figure(); f2->~Figure();f3->~Figure();f4->~Figure();f5->~Figure();f6->~Figure();return 0; break;
        default: cout<<(Rus("Ошибка ввода!"))<<endl; break;    
       }
    }
     
}
//Triangle
float Triangle::sqr()
{
    point A,B,C;
     double p,s;
     A.x=a[0].x; A.y=a[0].y;
     B.x=a[1].x; B.y=a[1].y;
     C.x=a[2].x; C.y=a[2].y;

     double a=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
     double b=sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y));
     double c=sqrt((A.x-C.x)*(A.x-C.x)+(A.y-C.y)*(A.y-C.y));
     
     p=(a+b+c)/2;

      s=sqrt(p*(p-a)*(p-b)*(p-c));
      return s;

}
void Triangle::read()
{
     for(int i=0;i<3;i++)
      cin>>a.x>>a.y;
}
//Rectanle
float Rect::sqr()
{
    point A,B,C,D;
      double s;
    A.x=a[0].x; A.y=a[0].y;
     B.x=a[1].x; B.y=a[1].y;
    C.x=a[2].x; C.y=a[2].y;
    D.x=a[3].x; D.y=a[3].y;

    double a=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
     double b=sqrt((C.x-B.x)*(C.x-B.x)+(C.y-B.y)*(C.y-B.y));
     double c=sqrt((D.x-C.x)*(D.x-C.x)+(D.y-C.y)*(D.y-C.y));
     double d=sqrt((A.x-D.x)*(A.x-D.x)+(A.y-D.y)*(A.y-D.y));
     
    s=a*b;      
      return s;
     

}
void Rect::read()
{
     for(int i=0;i<4;i++)
      cin>>a.x>>a.y;
}
//Figure
void Figure::print()
{
     if(n==4) {
              cout<<Rus("Прямоугольник с  вершинами:")<<endl<<a[0].x<<";"<<a[0].y<<endl<<a[1].x<<";"<<a[1].y<<endl<<a[2].x<<";"<<a[2].y<<endl<<a[3].x<<";"<<a[3].y<<endl;
              }
     if(n==3) {
              cout<<Rus("Треугольник с вершинами:")<<endl<<a[0].x<<";"<<a[0].y<<endl<<a[1].x<<";"<<a[1].y<<endl<<a[2].x<<";"<<a[2].y<<endl;
              }
     if(n>4) {
                        cout<<Rus("Многоугольник с вершинами:")<<endl;
                        for(int i=0;i<n;i++)
                        {
                                cout<<a.x<<";"<<a.y<<endl;
                        }
                        }
}
void Figure::move()
{
     point tmp;
     cout<<Rus("Введите вектор переноса:")<<endl;
     cin>>tmp.x>>tmp.y;
     for(int i=0;i<n;i++)
     {
     a.x+=tmp.x;
     a.y+=tmp.y;
     }
     cout<<Rus("Перенос выполнен")<<endl;
}
point Figure::getpoint(int tmp)
{
      point temp;
      temp.x=a[tmp].x;
      temp.y=a[tmp].y;
      return temp;
}
//=====================================================
bool prov(point p0,point p1,point p2,point p3)
{
     float a1,a2,b1,b2,c1,c2,x,y;
     a1=p1.x-p0.x;
     a2=p1.y-p0.y;
     b1=p2.x-p3.x;
     b2=p2.y-p3.y;
     c1=p2.x-p0.x;
     c2=p2.y-p0.y;
     if(fabs(a1*b2-b1*a2)<eps) return false;
     else
     {
         x=(c1*b2-c2*b1)/(a1*b2-a2*b1);
         y=(a1*c1-a2*c1)/(b2*a1-b1*a2);        
     }
     if (((x+eps)>0)&&((x-eps)<1)&&((y+eps)>0)&&((y-eps)<1)) return true;
     else return false;
}
bool pers(Figure* ob1,Figure* ob2)
{
     bool tmp=false;
     int m,l;
     point tr[3],kv[4];
     for(int i=0;i<3;i++)
     tr=ob1->getpoint(i);
     kv[0]=ob1->getpoint(0);
     kv[2]=ob1->getpoint(1);
     kv[1].x=kv[0].x;
     kv[1].y=kv[2].y;
     kv[3].x=kv[2].x;
     kv[3].y=kv[0].y;
     for(/*int*/ i=0;i<3;i++)  //стояло  незнаю зачем.. компилятор ругался
      for(int j=0;j<4;j++)
      {
              if (i=2) m=0; else m=i+1;
              if (j=3) l=0; else l=j+1;
              if (prov(tr,tr[m],kv[j],kv[l])) {tmp=true; break;}
      }
     return tmp;
}

int menu()
{
     char buf[10];
     int option;
     do
     {
     system("pause");
     system("cls");
     cout<<Rus("1 - Ввести координаты вершин треугольника.")<<endl;
     cout<<Rus("2 - Ввести координаты вершин прямоугольника.")<<endl;
     cout<<Rus("3 - Вывести площадь треугольника.")<<endl;
     cout<<Rus("4 - Вывести площадь прямоугольника.")<<endl;
     cout<<Rus("5 - Сравнить 2 треугольника по площади.")<<endl;
     cout<<Rus("6 - Сравнить 2 прямоугольника по площади.")<<endl;
     cout<<Rus("7 - Проверить на пересечения.")<<endl;
     cout<<Rus("8 - Перенести треугольник на заданный вектор.")<<endl;
     cout<<Rus("9 - Перенести прямоугольник на заданный вектор.")<<endl;
     cout<<Rus("10 - Вывести треугольник на экран.")<<endl;
     cout<<Rus("11 - Вывести прямоугольник на экран.")<<endl;
     cout<<Rus("12 - Выход.")<<endl;
     cin>>buf;
     option = atoi(buf);
     }
     while(!option);
     return option;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог