Задача. Даны координаты трех точек \(A\),\(B\),\(C\). Точки расположены так, что образуют треугольник. Дана еще одна точка \(D\). Необходимо проверить лежит ли эта точка внутри треугольника \(\triangle ABC\). Написать код программы на #С++.
Решение. Сразу заметим, что здесь будет предложено решение, которое нельзя назвать наилучшим. Это - быстрое решение, но имеет целый ряд недостатков. Классическая идея для решения состоит в том, что если точка \(D\) лежит внутри треугольника \(\triangle ABC\), то получаются три треугольника, содержащихся внутри данного и сумма их площадей должна равняться площади данного треугольника. Т.е. должно выполняться равенство:
Для решения задачи воспользуемся другой идеей:
Все точки треугольника (и любого выпуклого многоугольника) должны лежать по одну сторону от прямой, проходящей через каждую его сторону.Запишем уравнение прямой, проходящей, например, через точки A и B. Получим:
Теперь для любой точки \(\left( x;y \right)\) мы можем вычислить левую часть приведенного равенства. Для точек, лежащих на прямой мы должны получать ноль. В тоже время прямая разобьёт плоскость на две полуплоскости. Точки лежащие в одной полуплоскости будут давать положительные значения. А точки из другой полуплоскости — отрицательные.
Мы готовы проверить первое условие — принадлежит ли точка D \(\left( x_d,y_d \right)\) той же полуплоскости, что и точка C \(\left( x_c,y_c \right)\) относительно прямой \(\left( AB \right)\) ? Для этого подставим обе точки в левую часть приведенного выше уравнения прямой и убедимся, что получены значения одного и того же знака. А если одна из точек даст точно ноль? Это означает, что точка лежит на прямой. По условию задачи это может быть только точка D. Тогда она принадлежит треугольнику независимо от знака выражения, вычисленного для точки C.
Приведем код простенькой программы на С++. Вам надо ввести координаты трех вершин треугольника на плоскости, а затем координат точки, принадлежность которой треугольнику проверяется. Вот код программы.
#include
int main()
{
double xa, ya, xb, yb, xc, yc, xd, yd;
scanf ("%lf%lf", &xa, &ya); // читаем координаты точки A
scanf ("%lf%lf", &xb, &yb); // читаем координаты точки D
scanf ("%lf%lf", &xc, &yc); // читаем координаты точки C
scanf ("%lf%lf", &xd, &yd); // читаем координаты точки D
printf (
(((xd - xa)*(yb-ya)-(yd-ya)*(xb-xa))*((xc - xa)*(yb-ya)-(yc-ya)*(xb-xa)) >= 0) &&
(((xd - xb)*(yc-yb)-(yd-yb)*(xc-xb))*((xa - xb)*(yc-yb)-(ya-yb)*(xc-xb)) >= 0) &&
(((xd - xc)*(ya-yc)-(yd-yc)*(xa-xc))*((xb - xc)*(ya-yc)-(yb-yc)*(xa-xc)) >= 0 )?
"yes": "no");
return 0;
}
Проверить работу программы онлайн можно на нашем компиляторе
здесь. Скопируйте код программы (ctrl+c) и вставьте (ctrl+v) в компилятор вместо программы по умолчанию.
Студентам не просто даются задачи по геометрии, в том числе и по теме - треугольники. Если вы один из таких студентов и уже в отчаянии потому что у вас не получается решить очередную задачу по геометрии, то придется искать помощь в интернете, например, на сайте reshaemonline.com. Не отчаивайтесь.