Geometry in Pascal

From Free Pascal wiki
Revision as of 17:37, 27 September 2010 by Sekelsenmat (talk | contribs) (New page: ==Checking if a point is inside a polygon (integer version)== <delphi> // The function will return True if the point x,y is inside the polygon, or // False if it is not. // // Original...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Checking if a point is inside a polygon (integer version)

<delphi> // The function will return True if the point x,y is inside the polygon, or // False if it is not. // // Original C code: http://www.visibone.com/inpoly/inpoly.c.txt // // Translation from C by Felipe Monteiro de Carvalho // // License: Public Domain function IsPointInPolygon(AX, AY: Integer; APolygon: array of TPoint): Boolean; var

 xnew, ynew: Cardinal;
 xold,yold: Cardinal;
 x1,y1: Cardinal;
 x2,y2: Cardinal;
 i, npoints: Integer;
 inside: Integer = 0;

begin

 Result := False;
 npoints := Length(APolygon);
 if (npoints < 3) then Exit;
 xold := APolygon[npoints-1].X;
 yold := APolygon[npoints-1].Y;
 for i := 0 to npoints - 1 do
 begin
   xnew := APolygon[i].X;
   ynew := APolygon[i].Y;
   if (xnew > xold) then
   begin
     x1:=xold;
     x2:=xnew;
     y1:=yold;
     y2:=ynew;
   end
   else
   begin
     x1:=xnew;
     x2:=xold;
     y1:=ynew;
     y2:=yold;
   end;
   if (((xnew < AX) = (AX <= xold))         // edge "open" at left end
     and ((AY-y1)*(x2-x1) < (y2-y1)*(AX-x1))) then
   begin
     inside := not inside;
   end;
   xold:=xnew;
   yold:=ynew;
 end;
 Result := inside <> 0;

end; </delphi>