2006. augusztus 28., hétfő

How to detect if a point lies within a polygon


Problem/Question/Abstract:

Can anyone help me with detecting if the screen coordinates that a user has clicked on lies within a defined polygon?

Answer:

The code below is from Wm. Randolph Franklin with some minor modifications for speed. It returns 1 for strictly interior points, 0 for strictly exterior, and 0 or 1 for points on the boundary.

function PointInPolygonTest(x, y: Integer; aList: array of TPoint): Boolean;
var
  L, I, J: Integer;

  function xp(aVal: Integer): Integer;
  begin
    Result := PPoint(@aList[aVal]).X;
  end;

  function yp(aVal: Integer): Integer;
  begin
    Result := PPoint(@aList[aVal]).Y;
  end;

begin
  Result := False;
  L := Length(aList);
  if L = 0 then
    exit;
  J := L - 1;
  for I := 0 to L - 1 do
  begin
    if ((((yp(I) <= y) and (y < yp(J))) or ((yp(J) <= y) and (y < yp(I)))) and
      (x < (xp(J) - xp(I)) * (y - yp(I)) / (yp(J) - yp(I)) + xp(I))) then
      Result := not Result;
    J := I;
  end;
end;

Nincsenek megjegyzések:

Megjegyzés küldése