rj
2013-07-31 22:57:10
I found a function online to return whether or not a point is inside of a polygon, and I thought I would share it here:
Original link: http://wiki.freepascal.org/Geometry_in_Pascal
[spoiler=Original code:]
[spoiler=Converted to fit our needs:(very small changes)]
You need > 3 points for it to properly work.
Original link: http://wiki.freepascal.org/Geometry_in_Pascal
[spoiler=Original code:]
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;[/spoiler][spoiler=Converted to fit our needs:(very small changes)]
function R_inPolygon(Area: TPointArray): Boolean;
var
xnew, ynew, xold, yold, X1, Y1, X2, Y2: Cardinal;
i, numpoints, inside, X, Y: Integer;
begin
numpoints := Length(Area);
X := R_GetTileGlobal.x;
Y := R_GetTileGlobal.y;
if (numpoints < 3) then Exit;
xold := Area[numpoints - 1].x;
yold := Area[numpoints - 1].y;
for i := 0 to (numpoints - 1) do
begin
xnew := Area[i].x;
ynew := Area[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 < X) = (X <= xold)) and ((Y - Y1) * (X2 - X1) < (Y2 - Y1) * (X - X1))) then
inside := not inside;
xold := xnew;
yold := ynew;
end;
Result := inside <> 0;
end;[/spoiler]You need > 3 points for it to properly work.