Mega Code Archive

 
Categories / Delphi / Graphic
 

How to check if a point belongs to the interior of a polygon

Title: How to check if a point belongs to the interior of a polygon function PtInRgn(TestPolygon : array of TPoint; const P : TPoint): boolean; var ToTheLeftofPoint, ToTheRightofPoint : byte; np : integer; OpenPolygon : boolean; XIntersection : real; begin ToTheLeftofPoint := 0; ToTheRightofPoint := 0; OpenPolygon := False; {tests if the polygon is closed} if not ((TestPolygon[0].X = TestPolygon[High(TestPolygon)].X) and (TestPolygon[0].Y = TestPolygon[High(TestPolygon)].Y)) then OpenPolygon := True; {tests for each couple of points to see if the side between them crosses the horizontal line going through TestPoint} for np := 1 to High(TestPolygon) do if ((TestPolygon[np - 1].Y = P.Y) and (TestPolygon[np].Y P.Y)) or ((TestPolygon[np - 1].Y P.Y) and (TestPolygon[np].Y = P.Y)) {Wenn es so ist} {if it does} then begin {berechnet die x Koordinate des Schnitts} {computes the x coordinate of the intersection} XIntersection := TestPolygon[np - 1].X + ((TestPolygon[np].X - TestPolygon[np - 1].X) / (TestPolygon[np].Y - TestPolygon[np - 1].Y)) * (P.Y - TestPolygon[np - 1].Y); {increments appropriate counter} if XIntersection .X then Inc(ToTheLeftofPoint); if XIntersection P.X then Inc(ToTheRightofPoint); end; {if the polygon is open, test for the last side} if OpenPolygon then begin np := High(TestPolygon); {Thanks to William Boyd - 03/06/2001} if ((TestPolygon[np].Y = P.Y) and (TestPolygon[0].Y P.Y)) or ((TestPolygon[np].Y P.Y) and (TestPolygon[0].Y = P.Y)) then begin XIntersection := TestPolygon[np].X + ((TestPolygon[0].X - TestPolygon[np].X) / (TestPolygon[0].Y - TestPolygon[np].Y)) * (P.Y - TestPolygon[np].Y); if XIntersection .X then Inc(ToTheLeftofPoint); if XIntersection P.X then Inc(ToTheRightofPoint); end; end; if (ToTheLeftofPoint mod 2 = 1) and (ToTheRightofPoint mod 2 = 1) then Result := True else Result := False; end; {PtInRgn}