/*Файл:
Задача:

Автор:
Башмаков Максим Дмитриевич,  ИТ-11
Дата:
25,10,2015*/

# include <iostream> /*ввод, вывод cout<< cin>>*/
# include <iomanip> /*расшириные функции <iostream>*/
# include <cstdlib> /*преобразование типов*/
# include <math.h> /*стандартны функции*/
# include <ctime> /*пауза*/
#include <locale.h> /*русский язык*/
#include <cmath>
using namespace std;


struct Point {
	double x, y;
};

double x, y;

Point Ac, Bc, Cc, Dc;

class Quadrouge //вычисляет площадь по четырем координатам
{
	
protected:
	Point A, B, C, D;

public:
	Quadrouge() //конструктор по умолчанию
	{
		A.x = 0; A.y = 0;
		B.x = 0; B.y = 2;
		C.x = 2; C.y = 2;
		D.x = 2; D.y = 0;
	};
	void setCin(Point Ac, Point Bc, Point Cc, Point Dc) //конструктор
	{
		//инициируем координаты

		A.x = Ac.x; A.y = Ac.y;
		B.x = Bc.x; B.y = Bc.y;
		C.x = Cc.x; C.y = Cc.y;
		D.x = Dc.x; D.y = Dc.y;
	}

	double getArea(); //вычислить площадь
	void print();

};

double Quadrouge::getArea()
{
	double s, d1, d2, ccos, ssin; //s-сумма, d1-диагональ №1, d2-диагональ №2, ccos-косинус, ssin-синус,
	Point vek1, vek2; //vek1-ветор1, vek2-вектор2
	d1 = sqrt(pow((C.x - A.x), 2) + pow((C.y - A.y), 2)); //вычисляем диагональ1
	d2 = sqrt(pow((B.x - D.x), 2) + pow((B.y - D.y), 2)); //вычисляем диагональ2
	vek1.x = C.x - A.x;		vek1.y = C.y - A.y; //вычисляем вектор1
	vek2.x = D.x - B.x;		vek2.y = D.y - B.y; //вычисляем вектор2
	double znam;
	znam = (sqrt(pow(vek1.x, 2)*pow(vek1.y, 2))*sqrt(pow(vek2.x, 2)*pow(vek2.y, 2)));
	if (!znam == 0)
		ccos = (vek1.x*vek2.x + vek1.y*vek2.y) / znam; ////вычисляем косинус между двумя векторами
	else
	{
		cout << "не коректные координаты" << endl;
		return 0;
	}
	//ccos=(v1*v1)/(|v1|*|v2|)
	ssin = sqrt(1 - pow(ccos, 2)); //вычисляем синус sin^2=1-cos^2
	s = d1*d2*ssin / 2; //вычисляем площадь(s)
	return s;
}

void Quadrouge::print()
{
	cout << "__________________________________" << endl;
	cout << endl;
	cout <<"s = "<< getArea() << endl;
}

//_____________________________________________________________

class Rectangle : public Quadrouge // наследник класса Quadrouge
	//на ввод подается две координаты //вычисляет площадь по двум координатам
{

protected:
	Point BL, UR;

public:
	Rectangle()
	{
		BL.x = 0;	BL.y = 0;
		UR.x = 0;	UR.y = 0;
	}; //конструктор п умолчанию
	//Rectangle(Point BL, Point UR); //создание двух координат
	void setrecCin(Point Ac, Point Bc) //BL-координата (A), UR-координата(C)
	{
		BL.x = Ac.x; BL.y = Ac.y;
		UR.x = Bc.x; UR.y = Bc.y;
	};

	double getAreaRec(); //вычисление площади
	void printRec(); //вывод
};

double Rectangle::getAreaRec() //функция подсчета площощади
{
	//присваивание значений переменным A=BL, C=UR
	A.x = BL.x;	A.y = BL.y;
	B.x = BL.x;	B.y = UR.y;
	C.x = UR.x;	C.y = UR.y;
	D.x = UR.x;	D.y = BL.y;

	double s;  //переменная где будет хранится ответ
	s = getArea(); //функция из класса Quadrouge
	return s;
};

void Rectangle::printRec() //функция вывода
{
	cout << "__________________________________" << endl;
	cout << endl;
	cout << "s = "<<getAreaRec() << endl; //вызов функции из клсса Rectangle
}

class Wight //вычисляет площадь по двум сторонам
{	//задаются две стороны
protected:
	double width, hight; // width-высота, hight-ширина

public:

	Wight()//конструктор по умолчанию
	{
		width = 2;
		hight = 2;
	};
	void SetWightCin(double widthW, double hightW) //конструктор
	{
		width = widthW;
		hight = hightW;
	};
	double getAreaWig();
	void printWig();
};

double Wight::getAreaWig()//функция вычисляющая площадь
{
	double s;
	s = width*hight;
	return s;
};

void Wight::printWig() //функция вывода
{
	cout << "__________________________________" << endl;
	cout << endl;
	cout << "s = " << getAreaWig() << endl;
};

class Square : public Rectangle	//наследование класса Rectangle
{
	//вычисляет площадь по стороне и кординате
	double size; //длина стороны

public:
	Square()
	{
		BL.x = 0;
		BL.y = 0;
		size = 2;
	}; //конструкторм по умолчанию
	void setCinSq(Point Ac, double x)//функция ввода
	{
		BL.x = Ac.x;
		BL.y = Ac.x;
		size = x;
	};

	double getAreaSq()//функция выщитывающая площадь
	{
		double s;
		s = size*size;
		return s;
	};

	void printSq() //функция вывода
	{
		cout << "__________________________________" << endl;
		cout << endl;
		cout << "s = " << getAreaSq() << endl;
	}
}; 

void One()
{//функция вводит значения для функции getArea() класса Quadrouge
	cout << "A.x" << endl;
	cin >> Ac.x;
	cout << "A.y" << endl;
	cin >> Ac.y;
	cout << "B.x" << endl;
	cin >> Bc.x;
	cout << "B.y" << endl;
	cin >> Bc.y;
	cout << "C.x" << endl;
	cin >> Cc.x;
	cout << "C.y" << endl;
	cin >> Cc.y;
	cout << "D.x" << endl;
	cin >> Dc.x;
	cout << "D.y" << endl;
	cin >> Dc.y;
};

void Two()
{	//функция вводит значения для функции getAreaRec() класса Rectangle
	cout << "BL.x" << endl;
	cin >> Ac.x;
	cout << "BL.y" << endl;
	cin >> Ac.y;
	cout << "UR.x" << endl;
	cin >> Bc.x;
	cout << "UR.y" << endl;
	cin >> Bc.y;
};

void Tree()
{	//функция вводит значения для функции getAreaWig() класса Wight
	cout << "x - первая сторона" << endl;
	cin >> x;
	cout << "y - вторая сторона" << endl;
	cin >> y;
};

void Fo()
{	//функция вводит значения для класса Square
	cout << "x - сторона" << endl;
	cin >> x;
	cout << "BL.x" << endl;
	cin >> Ac.x;
	cout << "BL.y" << endl;
	cin >> Ac.y;
};
int main()
{
	setlocale(LC_CTYPE, "Russian");
	int i;
	cout << "введите i" << endl;
	cout << "i=1  |  вычисляет площадь по четырем координатам" << endl;
	cout << "i=2  |  вычисляет площадь по двум координатам" << endl;
	cout << "i=3  |  вычисляет площадь по двум сторонам" << endl;
	cout << "i=4  |  вычисляет площадь по стороне и двум кординатам" << endl;
	cin >> i;
	switch (i)
	{
	case 1:
	{
		One();
		Quadrouge fail;
		fail.setCin(Ac, Bc, Cc, Dc);
		fail.print();
		break;
	}

	case 2:
	{
		Two();
		Rectangle fail;
		fail.setrecCin(Ac, Bc);
		fail.printRec();
		break;
	}
	case 3:
	{
		Tree();
		Wight fail;
		fail.SetWightCin(x, y);
		fail.printWig();
		break;
	}

	case 4:
	{
		Fo();
		Square fail;
		fail.setCinSq(Ac, x);
		fail.printSq();
		break;
	}
	default:
		cout << "введен некоректное i" << endl;
		break;
	}



	system("pause");
	return 0;
}

