проверка прин точки треуг методом относительности положения function I

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// проверка прин. точки треуг. методом относительности положения
function IsPointIn_Relat(aAx, aAy, aBx, aBy, aCx, aCy, aPx, aPy: single): boolean;
// funcs
function Q(ax, ay, bx, by, atx, aty: single): single;
begin
Result := atx * (by - ay) + aty * (ax - bx) + ay * bx - ax * by;
end;
var
q1, q2, q3 : single;
begin
// выбираем определённую ориентацию по вершинам(чтоб было по порядку)
// универсальный
q1 := Q(aAx, aAy, aBx, aBy, aPx, aPy);
q2 := Q(aBx, aBy, aCx, aCy, aPx, aPy);
q3 := Q(aCx, aCy, aAx, aAy, aPx, aPy);
Result := ((q1 >= 0) and (q2 >= 0) and (q3 >= 0)) or
((q1 < 0) and (q2 < 0) and (q3 < 0));
//}
{
// для строгой ориентации по часовой
Result := (Q(ftx1, fty1, ftx2, fty2, fpx, fpy) >= 0) and
(Q(ftx2, fty2, ftx3, fty3, fpx, fpy) >= 0) and
(Q(ftx3, fty3, ftx1, fty1, fpx, fpy) >= 0);
//}
{
// для строгой ориентации против часовой
Result := (Q(ftx1, fty1, ftx2, fty2, fpx, fpy) <= 0) and
(Q(ftx2, fty2, ftx3, fty3, fpx, fpy) <= 0) and
(Q(ftx3, fty3, ftx1, fty1, fpx, fpy) <= 0);
//}
end;