# Polygon algorithm

In delphi, we can draw a polygon by using array of TPoint :

Canvas.Polygon(Points: Array of TPoint);

How can we know that a TPoint is "inside" that polygon ? I meant like "hit test" function.

For rectangle (x1,y1,x2,y2), I can use this "If" clause :

// Testing P.X and P.Y
if (P.X >= x1) And (P.Y >= y1) And (P.X <= x2) And (P.Y <= y2) then HIT := TRUE;

Anyone know the algorithm ?
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

You could create a region, and use the PtInRegion to determine if the point falls inside the polygon.

eg:

function PtInPolygon(Point: TPoint; Polygon: Array of TPoint): Boolean;
var  hrgnPoly:      HRGN;
begin

// Create polygon region
hrgnPoly:=CreatePolygonRgn(Polygon, Succ(High(Polygon)), WINDING);

// Make sure the region was created
if (hrgnPoly = 0) then
// Failure
result:=False
else
begin
// Check to see if point lies inside of the region
result:=PtInRegion(hrgnPoly, Point.X, Point.Y);
// Delete the region
DeleteObject(hrgnPoly);
end;

end;

Example usage (draws a triangle on the form and checks to see if mouse down event is in the triangle):

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin

if PtInPolygon(Point(X, Y), [Point(100, 100), Point(140, 1), Point(180, 100)]) then
ShowMessage('Point in polygon');

end;

procedure TForm1.FormPaint(Sender: TObject);
begin

// Draw the polygon so you have something visual to go by
Canvas.Polygon([Point(100, 100), Point(140, 1), Point(180, 100)]);

end;

Also, for the rectangle, there is a PtInRect function that you could use...

Hope this helps,
Russell

Commented:
or use this function

function PointInPoly(APoint : TPoint ; APoly : array of TPoint) : boolean;
Var
i, j : integer;
npol : integer;
begin
Result := false;
npol := length(APoly);
for i := 0 to npol - 1 do begin
j := (i + 1) mod npol;
if ((((APoly[i].Y <= APoint.Y) and (APoint.Y < APoly[j].Y)) or
((APoly[j].Y <= APoint.Y) and (APoint.Y < APoly[i].Y))) and
(APoint.X < (APoly[j].X - APoly[i].X) * (APoint.Y - APoly[i].Y) /
(APoly[j].Y - APoly[i].Y) + APoly[i].X)) then
Result := not Result;
end;
end;

Experts Exchange Solution brought to you by