Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Алгоритмы
Курсы ККДП
Дистрибутивы
Ссылки

HotLog


 
{ геометрические алгоритмы: Точка внутри сектора или нет?                  }
{ ------------------------------------------------------------------------ }
{ Если точка внутри сектора (или на сторонах) - 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.


Красноярский краевой Дворец пионеров, (c)2006 - 2017, ICQ: 151483