{ геометрические алгоритмы: Точка внутри треугольника? Вариант 2 }
{ ------------------------------------------------------------------------ }
{ Идея: Пусть есть треугольник ABC и точка P. Если Площадь ABC равна сумме }
{ площадей треугольников ABP,BCP,CAP, то точка внутри треугольника. }
{ ------------------------------------------------------------------------ }
{* функция вычисляет расстояние между точками *}
Function Distance(ax, ay, bx, by: real): real;
begin
Distance := sqrt(sqr(ax - bx) + sqr(ay - by));
end;
{* функция вычисляет площадь треугольника по формуле Герона *}
Function SqrGeron(ax, ay, bx, by, cx, cy : real): real;
var p, a, b, c: real;
Begin
a := Distance(cx, cy, bx, by);
b := Distance(ax, ay, cx, cy);
c := Distance(ax, ay, bx, by);
p := (a + b + c) / 2;
SqrGeron := sqrt(p * (p - a) * (p - b) * (p - c));
End;
{* функция определеяет относительное положение точки: внутри или нет *}
Function PointInsideTreangle(ax, ay, bx, by, cx, cy, px, py: real): boolean;
const
error = 1.000001;
var
s0, s1, s2, s3: real;
begin
PointInsideTreangle := TRUE;
s0 := SqrGeron(ax, ay, bx, by, cx, cy);
s1 := SqrGeron(ax, ay, bx, by, px, py);
s2 := SqrGeron(bx, by, cx, cy, px, py);
s3 := SqrGeron(cx, cy, ax, ay, px, py);
if s0 * error > s1 + s2 + s3 then PointInsideTreangle := TRUE
else PointInsideTreangle := FALSE;
end;
Begin {* Тело основной программы *}
writeln(PointInsideTreangle(1, 1, 8, 1, 1, 8, 2, 2));
writeln(PointInsideTreangle(1, 1, 8, 1, 1, 8, 6, 6));
End.