{ геометрические алгоритмы: Точка внутри сектора или нет? }
{ ------------------------------------------------------------------------ }
{ Если точка внутри сектора (или на сторонах) - TRUE, если нет - FALSE }
{ tx, ty - вершина сектора }
{ x1, y1, x2, y2 - точки на сторонах сектора }
{ px, py - точка на плоскости }
{ }
{ ------------------------------------------------------------------------ }
{ sing - возвращает знак числа: }
{ 1 - положительное число, }
{ -1 - отрицательное, }
{ 0 - равно нулю. }
function sign(r: real): integer;
begin
sign := 0; if r = 0 then exit;
if r < 0 then sign := -1 else sign := 1;
end;
function InsideSector(tx, ty, x1, y1, x2, y2, px, py: real): boolean;
var x, y, a1, a2, b1, b2, c1, c2: real;
var i1, i2, i3, i4: integer;
begin
x := (tx + x1 + x2) / 3;
y := (ty + y1 + y2) / 3;
a1 := ty - y1;
b1 := x1 - tx;
c1 := tx * y1 - ty * x1;
a2 := ty - y2;
b2 := x2 - tx;
c2 := tx * y2 - ty * x2;
i1 := sign(a1 * x + b1 * y + c1);
i2 := sign(a2 * x + b2 * y + b2);
i3 := sign(a1 * px + b1 * py + c1);
i4 := sign(a2 * px + b2 * py + c2);
InsideSector := ((i1 = i3) and (i2 = i4)) or
((i1 = 0) and (i2 = i4)) or ((i1 = i3) and (i2 = 0));
end;
begin { основная программа, вызов функции - тест }
writeln(InsideSector(1, 1, 5, 1, 1, 5, 3, 3));
writeln(InsideSector(1, 1, 5, 1, 7, 2, 3, 3));
end.