/*
Заданы три точки на плоскости: M с координатами (x1,y1), L с координатами
(x2,y2) и H с координатами (x3,y3). Определите, лежат ли они на одной
прямой. При отрицательном ответе найти площадь и периметр треугольника
MLH.
*/
/*
codeby.net
Autor: DarkKnight125 (Denis Goncharov)
*/
#include <iostream>
using namespace std;
//Для удобства введем структуры
struct POINT
{
double x; // проектция точки на ось x
double y; //Проекция точки на ось y
};
//Структура прямая y = kx+b
struct LINE
{
double k; //Коэффициент k
double b; //Коэффициент b
};
//Функция получения прямой по двум точкам
LINE GetLine (POINT A, POINT B)
{
LINE Result;
double c = A.x - B.x;
Result.k = (B.y - A.y) / -c;
Result.b = ( -A.x*(B.y - A.y) + A.y*(B.x - A.x))/-c;
return Result;
};
//Функция определения длины отрезка между двумя точкаи
double GetLenghtLine(POINT A, POINT B)
{
return sqrt(pow(A.x - B.x,2) + pow(A.y - B.y,2));
}
//Опеределить не пересекает ли прямая треугольник можно узнав находятся ли все точки по одну сторону от прямой
//Вычислить это можно приведя из уравнения прямой, функцию F(x,y) = kx+b - y;
//Значение функции может быть положительное - если точка лежит с права от прямой, отрицательное если точка лежит слева от прямой
//и равное 0, если точка принадлежит прямой
//В случае с треугольником: если значение функции во всех точка треугольника(вершинах) имеет один знак (+/-), то прямая не пересекает треугольник
//Иначе прямая пересекает трекугольник
//Функция определения положения точки относительно прямой
double Funct (POINT point, LINE line) //point - точка по отношению которой ведется вычисление, line - уравнение прямой
{
return (line.k * point.x + line.b - point.y);
}
void main(void)
{
setlocale(LC_ALL,".1251");
POINT Arr[3]; //Массив точка (наши 3 точки)
cout <<"Введите координаты точек" << endl;
for (int i = 0; i<3; i++)
{
cout << "Введите координаты точки №" << i+1 << " (x y): ";
cin >> Arr[i].x >> Arr[i].y;
}
cout << "-----------------------------------------------------" << endl;
//Теперь проверим лежат ли все точки на одной прямой прямой
LINE L = GetLine(Arr[0],Arr[1]); //Взяв любые 2 токи определим уравнения прямой
bool AllOnOneLine = true; //Предположим что все точки лежат на одной прямой
for (int i = 0; i< 3; i++)
if ( Funct(Arr[i], L) != 0) //Если хоть одна точка не лежит на прямой, значит наше утверждение - ошибочно
{
AllOnOneLine = false;
break;
}
double Pr = 0; //Перимметр треугольника
if (!AllOnOneLine) //Если точки не лежат на одной прямой, то найдем перимметр и выведим сообщение
{
for (int i = 1; i<3; i++)
Pr += GetLenghtLine(Arr[i-1],Arr[i]);
cout << "Точки не лежат на одной прямой, периметр треугольника = " << Pr << endl;
} else cout << "Все точки лежат на одной прямой y = "<<L.k<<"x" << "+ (" <<L.b<<")"<< endl;
}