IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Savoir si un point est dans un polygone.


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de poly128
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 73
    Points
    73
    Par défaut Savoir si un point est dans un 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?

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    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.

  3. #3
    rbh
    rbh est déconnecté
    Membre confirmé Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 381
    Points : 471
    Points
    471
    Par défaut
    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/

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    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

  5. #5
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    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

  6. #6
    Membre régulier Avatar de poly128
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 73
    Points
    73
    Par défaut
    Merci à tous ça marche maintenant.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    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.

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    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.
    Raaah, Bien vu sglug! Kolossale erreur c'est l'inverse :
    • nb d'intersecton impair : point à l'intérieur
    • nb d'intersecton pair : point à l'extérieur
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    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
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [3D] Comment savoir si un point est dans mon champ de vision
    Par patmaba dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 04/11/2018, 13h20
  2. Appartenance à un polygone
    Par sglug dans le forum Mathématiques
    Réponses: 18
    Dernier message: 14/07/2015, 12h03
  3. Comment peut on savoir si un point existe dans un polygone?
    Par Midou45 dans le forum Mathématiques
    Réponses: 2
    Dernier message: 04/03/2008, 22h03
  4. Savoir si un point est dans la zone affiché
    Par nicoenz dans le forum OpenGL
    Réponses: 6
    Dernier message: 08/12/2006, 15h59
  5. Trouver si un point est dans un polygone
    Par Mucho dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 15/09/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo