判断一个点是否在一个多边形中的算法

这个算法抄自Graphics 32 的 GR32_Polygons.pas ,大名鼎鼎的开源图形组件,官网地址请大家上导航里找。

function PtInPolygon(const Pt: TPoint; const Points: array of TPoint): Boolean;
var
  I: Integer;
  iPt, jPt: PPoint;
begin
  Result := False;
  iPt := @Points[0];
  jPt := @Points[High(Points)];
  for I := 0 to High(Points) do
  begin
    Result := Result xor (((Pt.Y >= iPt.Y) xor (Pt.Y >= jPt.Y)) and
      (Pt.X - iPt.X < MulDiv(jPt.X - iPt.X, Pt.Y - iPt.Y, jPt.Y - iPt.Y)));
    jPt := iPt;
    Inc(iPt);
  end;
end;

具体算法的原理俺没研究,图形算法不是俺的强项,俺只负责抄一下。

分享到: