7

TCustomControl多数のポリゴン リスト項目 (不規則な形状) で構成されるDelphi (から継承) でカスタム コントロールを作成しています。アイテムごとにマウス イベントを実装する必要がありますが、まず、マウスの位置が特定のポリゴン内にあるかどうかを検出できる必要があります ( 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;
4

4 に答える 4

16

使用できます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;
于 2012-05-10T19:25:55.173 に答える
5

ここにあるレイキャスティングアルゴリズムを使用できます:http: //en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm

ほとんどのコンピュータグラフィックスクラスは、これを例として使用します。

于 2012-05-10T19:27:59.577 に答える
2

ポイントが多角形の内側にあるかどうかを確認するには、そのポイントを通る水平線を想像し、この想像線が多角形と交差する回数を左から右に数えます。ポイントに到達する前に交差するポリゴンの数が奇数の場合、ポイントは内側にあり、偶数の場合、ポイントはポリゴンの外側にあります。

于 2014-03-20T10:02:57.883 に答える