ЗАДАЧА-Программирование разветляющихся

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Заданы три точки на плоскости: M с координатами (x1,y1), L с координатами
(x2,y2) и H с координатами (x3,y3). Определите, лежат ли они на одной
прямой. При отрицательном ответе найти площадь и периметр треугольника
MLH.
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Заданы три точки на плоскости: M с координатами (x1,y1), L с координатами
(x2,y2) и H с координатами (x3,y3). Определите, лежат ли они на одной
прямой. При отрицательном ответе найти площадь и периметр треугольника
MLH.
Опять же невижу теории по теме....
Пожалуйста запостите теорию по заданному критерию....
 

DarkKnight

Well-known member
01.08.2010
653
0
#3
Заданы три точки на плоскости: M с координатами (x1,y1), L с координатами
(x2,y2) и H с координатами (x3,y3). Определите, лежат ли они на одной
прямой. При отрицательном ответе найти площадь и периметр треугольника
MLH.
C++:
/*
Заданы три точки на плоскости: 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;

}
 

Вложения

G

Guest

#4
C++:
/*
Заданы три точки на плоскости: 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;

}



:facepalm: СПААААААСИБО БОЛЬШОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!