Точка внутри сектора или нет — Pascal(Паскаль)

Если точка внутри сектора (или на сторонах) — TRUE, если нет — FALSE; tx,ty — вершина сектора; x1,y1,x2,y2 — точки на сторонах сектора; px,py — точка на плоскости ;возвращает знак числа, 1 — положительное число, -1 — отрицательное, 0 — 0

unction 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.

Leave a Comment

− 1 = 1