J'ai dessiné un polygone avec plus de dix sommets dans une form et je veus par la suite savoir si le curseur de la souris est dans le polygone.
Y a t'il un moyen de faire ça sans avoir un tableau de tpoint de toute les pixels du polygone?
J'ai dessiné un polygone avec plus de dix sommets dans une form et je veus par la suite savoir si le curseur de la souris est dans le polygone.
Y a t'il un moyen de faire ça sans avoir un tableau de tpoint de toute les pixels du polygone?
Bonjour,
Je pense que ce document te sera d'une grande utilité.
http://www.iag.asso.fr/articles/intersection.htm
Cordialement
Salut
Chez nous, après de nombreuse recherche au travers du net pour trouver une fonction potable, on utilise ceci. Cherche "PointInPolygon" dans cette page/
Bonjour,
Une méthode simple (classique) consiste à déterminer les intersections d'une demi droite orientée vers le nord (ou un autre point cardinal) avec les cotés du polygone : si le nombre est impair, le point est à l'extérieur.
Pour résoudre facilement le petit effet de bord lorsqu'un sommet se retrouve sur la demi-droite, on le décale d'epsilon vers la gauche.
Pour traiter les intersections, 3 cas :
1) les 2 extrémités sont au-dessous du point traité : pas d' intersection,
2) les 2 extrémités sont au-dessus du point traité : 1 intersection si l'abcisse du point traité se trouve entre celles des extrémités.
3) autre cas, 1 intersection possible si l'abcisse du point traité se trouve entre celles des extrémités, pas d'intersection sinon. Pour savoir si le point est au-dessus ou au-dessous du segment: il faut comparer Py à
E1y+(E2y-E1y)/(E2x-E1x)
Encore une autre version :
Code Extrait de VectorGeometry de GlScene : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 // PointInPolygon // function PointInPolygon(var xp, yp: array of Single; x, y: Single) : Boolean; // The code below is from Wm. Randolph Franklin <wrf@ecse.rpi.edu> // 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. var I, J: Integer; begin Result:=False; if High(XP)=High(YP) then begin J:=High(XP); for I:=0 to High(XP) 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; end;
Partager