#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;
}
класс фигур
Доброго времени суток . Снова нужна помощь . Задание такое : создать абстрактный класс фигур и сделать 2 наследника (класс треугольников и прямоугольников) . Методы : нахождение площади фигуры , сравнение по площади , перемещение на заданный вектор , определение пересечения фигур и отношение включения друг в друга . В общем то прога написана , все работает , но вот не знаю , как определить включение . Если кто-то знает , подскажите плиз . Вот код :