\[S_{\triangle ABC}=S_{\triangle DBC}+S_{\triangle DAB}+S_{\triangle DAC}\]
А теперь поясним проблему. Вам придется сравнивать значения двух действительных чисел - площадь данного треугольника и сумму площадей трех внутренних треугольников. А, как известно, это можно сделать только с определенной точностью. На практике рассматривают разность этих площадей по модулю и сравнивают с маленьким числом, задающим точность сравнения. А это плохо.

Для решения задачи воспользуемся другой идеей:
Все точки треугольника (и любого выпуклого многоугольника) должны лежать по одну сторону от прямой, проходящей через каждую его сторону.
Запишем уравнение прямой, проходящей, например, через точки A и B. Получим:
\[\left( x - x_A \right) \left( y_B - y_A \right) - \left( y - y_A \right) \left( x_B - x_A \right) = 0\].
Уравнение записано в такой форме, чтобы не приходилось выполнять деление и переживать о нуле в знаменателе.

Теперь для любой точки \(\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) в компилятор вместо программы по умолчанию.


 Похожие публикации
2015-11-01 • Просмотров [ 697 ]