Check_Point_In_Poly.PAS

{* Алгоритм "входит ли точка в обьект" *}

Unit CHECK_POINT_IN_POLY;
Interface
Implementation
Begin
 writeln('Алгоритм: Точка лежит внутри многоугольника, если кол-во точек пересечения нечетно. Все отрезки кроме горизонтальных проверяются на пересечение с горизонтальным лучом, выходящим из проверяемой точки. При попадании луча в вершину пересечение засчитывается только с теми отрезками, выходящими из вершины, для которых она является верхней.');
End.

{     Code by VanDamM // [WRC]       Алгоритм: Точка лежит внутри многоугольника, если кол - во               точек пересечения нечетно.               Все отрезки кроме горизонтальных проверяются на пересечение               с горизонтальным лучом, выходящим из проверяемой точки.               При попадании луча в вершину пересечение засчитывается               только с теми отрезками, выходящими из вершины, для которых она               является верхней.  }
Program Check_Point_In_Poly;

Uses Check_Point_In_Poly.pas; {* Эту строку можно удалить *}
Uses Crt; {* Подключаем внешние файлы *}
Type {* Используемые типы *}
  Point = Record   { тип точка }
  x, y : integer;
  End;
Var {* В работе нам потребуются переменные: *}
  PointXY : Point; { проверяемая точка }
  Poly    : Array[0..24] Of Point; { массив вершин многоугольника }
  C       : integer; { кол - во вершин многоугольника }
  i       : integer;
  j       : integer;
Function Max( Num1, Num2 : integer ) : integer;
Begin
If Num1 > Num2 Then
  Max := Num1
Else Max := Num2;
  End;
Function Min( Num1, Num2 : integer ) : integer;
Begin
If Num1 A.y) And (p[j].y > A.y) Then
  Continue;
If (P[i].y < A.y) And (p[j].y < A.y) Then
  Continue;
If Max(P[i].y, P[j].y) = A.y Then
  Inc(Count) {* Прибавим к Count единицу *}
Else If Min(P[i].y, P[j].y) = A.y Then
  Continue
Else Begin
  T := (A.y - P[i].y) / (P[j].y - P[i].y);
If ((T > 0) And (T = A.x) Then
  Inc(Count); {* Увеличиваем Count на 1 *}
End;

End;
PointInPoly := Count And 1;
End;
Begin
ClrScr; {* Очистка экрана *}
EnterData;
WriteLn; {* Пропускаем одну строку *}
If PointInPoly(PointXY, Poly, C) = 0 Then
  Write('Answer: Point out Of poly')
Else Write('Answer: Point In poly');
  ReadKey; {* Ждем нажатия любой клавиши *}
End......