...
Что касается произвольного ВЫПУКЛОГО многоугольника, то можно поступать так. Необходимо представить многоугольник как набор ориентированных отрезков (векторов), задающих его, положим, по часовой стрелке (важно, чтобы ориентация векторов была одинаковой!). Далее, для каждого вектора и проверяем расстояние до него от заданной точки.
type
TEdge = record
org, dest: TPoint;
end;
function Distance(p: TPoint; e: TEdge): real;
var
A, B, C, d, r: real;
begin
A := e.dest.y — e.org.y;
B := e.org.x — e.dest.x;
C := -A * e.org.x — B * e.org.y;
d := sqrt(A*A+B*B);
if d = 0
then r := 1
else r := (A * p.x + B * p.y + C) / d;
Result := r;
end;
Если для всех векторов это расстояние одного знака (положительного — в случае определения многоугольника векторами ПО часовой стрелке), то точка лежит ВНУТРИ многоугольника, иначе — ВНЕ.
В общем случае, если многоугольник — произвольный, то необходимо произвести его деление на серию выпуклых и для них провести вышеописанную обработку.
Ещё можно, вообще, произвести триангуляцию многоугольника (т.е. его разбиение на треугольникики и проверить положение точки внутри треугольника — про это уже писали сотню раз и это проще), например, Делоне.