Главная
Дисциплины (2009-2010)
Дисциплины (2010-2011)
Разное
Популярные

Геометрические алгоритмы: точка внутри сектора или нет?:

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


Последнее обновление:
Copyright (C) 2009-2010 by RA0LHS
Hosted by uCoz