Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   "Hit Test" im Polygon mittels PtInRegion (https://www.delphipraxis.net/152414-hit-test-im-polygon-mittels-ptinregion.html)

soulies 22. Jun 2010 06:35

"Hit Test" im Polygon mittels PtInRegion
 
Liste der Anhänge anzeigen (Anzahl: 1)
hoi,

ich speicher in einem array die eckpunkte eines polygons.
Delphi-Quellcode:
array of TPointfloat
Mit einem Messgerät nehme ich Punkte auf und will diese nun vergleichen ob sie sich innerhalb
des polygons befinden. (die Messpunkte sind auch vom Typ TPointfloat)

Zum überprüfen habe ich folgende Funktion gefunden:
Delphi-Quellcode:
function PtInPolygon(const x,y : integer; aPolygon: array of TPoint): boolean;
var
  PolyHandle: hRgn;
begin
  PolyHandle := CreatePolygonRgn(aPolygon[0], Length(aPolygon), Winding);
  result    := PtInRegion(PolyHandle,X,Y);
  DeleteObject(PolyHandle);
end;
Frage: Ist es überhaupt möglich mit "CreatePolygonRgn" mein Polygon zu beschreiben ?
Wenn ja - wie löse ich am effektivsten die Typumwandlung von TPointfloat zu TPoint,
wenn nein - welche Alternativen hätte ich ?

Eine kleine Zeichnung zur Veranschaulichung hängt mit dran.

cya

Uwe Raabe 22. Jun 2010 06:53

AW: "Hit Test" im Polygon mittels PtInRegion
 
Du musst sowohl dein Polygon als auch die Messpunkte in Integer-Werte umwandeln. Wenn dir der damit enstehende Genauigkeitsverlust egal ist, kannst du dieses Verfahren anwenden.

Aus Performancegründen solltest du allerdings die PolygonRgn nur einmal erzeugen und dann immer nur PtInRgn aufrufen.

Zur Umwandlung von TPointFloat zu TPoint: Ermittle den möglichen Bereich der Messpunkte und mappe den auf den erlaubten Bereich von TPoint. Ich bin mir nicht sicher, ob wirklich der gesamte Integer-Bereich zulässig ist. Zumindest bei Win95/98/Me war das jedenfallls nicht so. Es ist dabei übrigens egal, ob du die X- und Y-Koordinaten mit den gleichen Faktoren umrechnest. Da du nur mit geraden Linien arbeitest, würde auch bei einer Verzerrung das richtige herauskommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz