/*
1) Разработать класс "Прямая на плоскости". Реализовать, если необходимо, конструкторы и деструктор.
Переопределить операции ввода\вывода и операции определения параллельности и перпенликулярности двух прямых.
Разработать функцию определения точки пересечения двух прямых, функцию опеределения принадлежности заданной точки прямой,
функцию определения прямой, проходящей через две точки.
*/
/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>
#include <ctype.h>
//Структура точка
struct TPoint
{
double x; //координаты х
double y; // координаты y
};
//Класс прямая линия
class TLine
{
private:
double a;
double b;
double c;
public:
TLine::TLine(double , double, double); //Конструктор класса прямой со вводом аргументов
TLine::TLine(); //Конструктор по умолчанию
bool TLine::isParallele(TLine B); //Определение параллельности
bool TLine::isPerpendiculare(TLine B); //Определение перпендикулярности
bool TLine::GetCrossPoint(TLine B, TPoint &Point); //функция определения Пересечение в точки
friend std::ostream& operator<< (std::ostream& out,TLine& Line); //Перегруженая функция вывода в поток ostream
friend std::istream& operator>> (std::istream& in,TLine& Line); //Перегруженая функция ввода в поток istream
};
//Конструктор по умолчанию
TLine::TLine()
{
a = 1;
b = 0;
c = 0;
}
//Конструктор класса прямой со вводом аргументов
TLine::TLine(double a, double b, double c = 0.0)
{
if (a==0 && b==0) // проверим что бы (a и b) одновременно не были равны нулю
{
a=1; b=1;
}
this->a = a;
this->b = b;
this->c = c;
}
//Перегруженая функция вывода в поток ostream
std::ostream& operator<< (std::ostream& out,TLine& Line)
{
out<<Line.a<<"x + "<<Line.b<<"y + "<<Line.c<<" = 0";
return out;
}
//Перегруженая функция ввода в поток istream
std::istream& operator>> (std::istream& in,TLine& Line)
{
std::cout<<std::endl<<"Введите уравнение прямой типа Ах+By + C =0 "<<std::endl;
std::cout<<"Введите A = ";
in>>Line.a;
std::cout<<"Введите B = ";
in>>Line.b;
std::cout<<"Введите C = ";
in>>Line.c;
//Проверим что бы одновременно не были равны нулю A и B
if (Line.a == 0 && Line.b ==0)
{
Line.a = 0;
}
return in;
}
bool TLine::isParallele(TLine B)//Определение параллельности
{
if((this->a *B.b - B.a * this->b) == 0) return true;
else return false;
}
//Определение перпендикулярности
bool TLine::isPerpendiculare(TLine B)
{
if((this->a *B.a + B.b * this->b) == 0) return true;
else return false;
}
//функция определения Пересечение в точки
bool TLine::GetCrossPoint(TLine B, TPoint &Point)
{
if (this->isParallele(B)) return false;
Point.x = (this->b * B.c - B.b * this->c)/(this->a * B.b - B.a * this->b);
Point.y = (this->c * B.a - B.c * this->a)/(this->a * B.b - B.a * this->b);
return true;
}
//Главная функция программы
void main(void)
{
setlocale(LC_ALL,"Russian");
//Конструкторы
TLine a(1,1);
TLine b(2,2,4);
TPoint k;
k.x = 1; k.y =1;
std::cout<<"Прямая А: "<<a<<std::endl;
std::cout<<"Прямая B: "<<b<<std::endl;
//Параллельность прямых
std::cout<<"Параллельность A и B :";
(a.isParallele(b)) ? std::cout<<"Параллельны": std::cout<<"Не параллельны";
std::cout<<std::endl;
//Перпендикулярность прямых
std::cout<<"Перпендикулярность A и B :";
(a.isPerpendiculare(b)) ? std::cout<<"Перпендикулярны": std::cout<<"Не перпендикулярны";
std::cout<<std::endl;
//Пересечение в точке
if (!a.GetCrossPoint(b,&k))
std::cout<<"Прямые не пересекаются";
else std::cout<<"Прямые пересекаются в точке :"<<k.x<<","<<k.y<<std::endl;
//Потоковый ввод/вывод
std::cout<<std::endl<<a;
std::cin>>a;
std::cout<<a;
}