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
Pensez à utiliser les tags dans le titre.
Avant de poser une question reportez-vous à la FAQ Delphi
Respectez les règles du forum.
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)
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
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;
"Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
"Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
"Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry
moi ce qui me géné dans cette méthode est que le polygone ne peut etre que proche de la forme d'un cercle.
un cas concret si je prend Geneve et bien ta demi droite orientée vers le nord coupe le polygone formé par la france 4 fois, pour autant il n'est pas en france.
Raaah, Bien vu sglug! Kolossale erreur c'est l'inverse :Graffito : si le nombre est impair, le point est à l'extérieur
sglug : un cas concret si je prend Geneve et bien ta demi droite orientée vers le nord coupe le polygone formé par la france 4 fois, pour autant il n'est pas en france.
- nb d'intersecton impair : point à l'intérieur
- nb d'intersecton pair : point à l'extérieur
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
Il existe aussi la méthode "brutale" que j'utilise de plus en plus vu sa facilité de mise en oeuvre et la puissance des machines de nos jours
1) créer un bitmap aux dimensions du composant à l'écran
2) dessiner le polygone sur ce bitmap en noir sur blanc par exemple
3) tester la couleur de Pixels[x,y]
NB: il faut évidemment être en mesure de dessiner le polygone en question
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager