|
{ геометрические алгоритмы: Точка внутри сектора или нет? }
{ ------------------------------------------------------------------------ }
{ Если точка внутри сектора (или на сторонах) - TRUE, если нет - FALSE }
{ tx,ty - вершина сектора }
{ x1,y1,x2,y2 - точки на сторонах сектора }
{ px,py - точка на плоскости }
{ }
{ ------------------------------------------------------------------------ }
{возвращает знак числа, 1 - положительное число, -1 - отрицательное, 0 - 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)); {test1, yes Inside}
writeln(InsideSector(1,1,5,1,7,2,3,3)); {test2, no Intersection}
end.
| |