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

Геометрические алгоритмы: с какой стороны вектора лежит точка? (Вариант 2):

{ геометрические алгоритмы: Точка внутри треугольника?  Вариант 2          }
{ ------------------------------------------------------------------------ }
{ Идея: Пусть есть треугольник ABC и точка P. Если Площадь ABC равна сумме }
{ площадей треугольников ABP,BCP,CAP, то точка внутри треугольника.        }
{ ------------------------------------------------------------------------ }

{* функция вычисляет расстояние между точками *}
Function Distance(ax, ay, bx, by: real): real;
begin
  Distance := sqrt(sqr(ax - bx) + sqr(ay - by));
end;

{* функция вычисляет площадь треугольника по формуле Герона *}
Function SqrGeron(ax, ay, bx, by, cx, cy : real): real;
var p, a, b, c: real;
Begin
  a := Distance(cx, cy, bx, by);
  b := Distance(ax, ay, cx, cy);
  c := Distance(ax, ay, bx, by);
  p := (a + b + c) / 2;
  SqrGeron := sqrt(p * (p - a) * (p - b) * (p - c));
End;

{* функция определеяет относительное положение точки: внутри или нет *}
Function PointInsideTreangle(ax, ay, bx, by, cx, cy, px, py: real): boolean;
const 
    error = 1.000001;
var 
    s0, s1, s2, s3: real;
begin
    PointInsideTreangle := TRUE;
    s0 := SqrGeron(ax, ay, bx, by, cx, cy);
    s1 := SqrGeron(ax, ay, bx, by, px, py);
    s2 := SqrGeron(bx, by, cx, cy, px, py);
    s3 := SqrGeron(cx, cy, ax, ay, px, py);
    if s0 * error > s1 + s2 + s3 then PointInsideTreangle := TRUE
                                 else PointInsideTreangle := FALSE;
end;

Begin {* Тело основной программы *}
   writeln(PointInsideTreangle(1, 1, 8, 1, 1, 8, 2, 2));
   writeln(PointInsideTreangle(1, 1, 8, 1, 1, 8, 6, 6));
End.


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