确定一个点是否在多边形内?

Jer*_*dge 7 delphi polygon custom-controls delphi-xe2

我正在Delphi中创建一个自定义控件(继承自TCustomControl),它包含许多多边形列表项(不规则形状).我需要为每个项目实现鼠标事件,但首先我需要能够检测鼠标位置是否在给定的多边形(array of TPoint)内.我正在捕获命中测试消息(WM_NCHITTEST),这是我需要进行此验证的地方.我有许多多边形,我将遍历每个多边形项并执行此检查以查看鼠标的X/Y位置是否在此多边形内.

procedure TMyControl.WMNCHitTest(var Message: TWMNCHitTest);
var
  P: TPoint; //X/Y of Mouse
  Poly: TPoints; //array of TPoint
  X: Integer; //iterator
  I: TMyListItem; //my custom list item
begin
  P.X:= Message.XPos;
  P.Y:= Message.YPos;
  for X := 0 to Items.Count - 1 do begin
    I:= Items[X]; //acquire my custom list item by index
    Poly:= I.Points; //acquire polygon points

    //Check if Point (P) is within Polygon (Poly)...?

  end;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 15

你可以使用PtInRegion:

function PointInPolygon(Point: TPoint; const Polygon: array of TPoint): Boolean;
var
  rgn: HRGN;
begin
  rgn := CreatePolygonRgn(Polygon[0], Length(Polygon), WINDING);
  Result := PtInRegion(rgn, Point.X, Point.Y);
  DeleteObject(rgn);
end;
Run Code Online (Sandbox Code Playgroud)

  • @Andreas我不认为开销很糟糕.GDI区域应该非常轻量级.如果这是一个问题,那么您可以缓存多边形旁边的区域. (4认同)

MrW*_*Wuf 5

您可以使用此处的光线投射算法:http: //en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm

大多数计算机图形类都以此为例.