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

Algorithmes et structures de données Discussion :

Savoir si un point se trouve à l'intérieur d'un polygone fermé?


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut Savoir si un point se trouve à l'intérieur d'un polygone fermé?
    Bonjour,

    Pour un de mes développements, je dois savoir si un point se trouve à l'intérieur d'un polygone fermé ...
    Je possède la liste des n points du polygone: p0, p1, ... pn-1.
    Comme il s'agit d'un polygone fermé: p0 = pn <=> (x0,y0) = (xn, yn).

    Je me sers donc de n + 1 points mais l'utilisateur n'en fournit que n.

    Quelqu'un pourrait m'aider svp? Je suis câlé...

    @+,
    Rod
    Rodrigue

  2. #2
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Je pense p-e avoir un début de piste.
    Lorsqu'un point est à l'intérieur d'un polygone, la somme des angles entre ce point et les points constituants le polygone est égale à 360°.

    Est-ce que c'est correct?
    Rodrigue

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Rodrigue Voir le message
    Je pense p-e avoir un début de piste.
    Lorsqu'un point est à l'intérieur d'un polygone, la somme des angles entre ce point et les points constituants le polygone est égale à 360°.

    Est-ce que c'est correct?
    non..

    C'est juste si le polygone est convexe..


    http://www.faqs.org/faqs/graphics/algorithms-faq/

    sujet 2.03
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Se ramener a un cas que tu sais calculer facilement le triangle.

    Si tu sais décomposer ton polygone en triangles, alors il te suffit de calculer si le point est dans l'un des triangles.

    http://www.siggraph.org/education/ma...s/polygon1.htm

    http://fr.wikipedia.org/wiki/Triangu...39;un_polygone

    mais elle est moins efficace que celle de souviron je pense.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Se ramener a un cas que tu sais calculer facilement le triangle.

    Si tu sais décomposer ton polygone en triangles, alors il te suffit de calculer si le point est dans l'un des triangles.
    pourquoi se compliquer la vie ??


    Regarde la complexité des calculs...


    Cet algorithme a une complexité en O(n log n).


    L'algo cité est en O(N), avec une complexité simple.




    NB: la triangulation peut être une très bonne méthode pour plein de choses, mais la meilleure méthode à mon sens est celle de Delaunay (les triangles les plus équilatéraux (ou isocèles) possibles et les plus "égaux").. Mais pour ce genre de problème c'est un peu prendre un marteau pour écraser une mouche..

    Quant au problème de découper en triangles un polygone, le poids tient au fait que chque sommet participe pour 3 fois aux calculs : 2 fois à chaque extrémité de la base et 1 fois en tant que sommet du triangle..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    pourquoi se compliquer la vie ??
    Regarde la complexité des calculs...
    L'algo cité est en O(N), avec une complexité simple.

    NB: la triangulation peut être une très bonne méthode pour plein de choses, mais la meilleure méthode à mon sens est celle de Delaunay (les triangles les plus équilatéraux (ou isocèles) possibles et les plus "égaux").. Mais pour ce genre de problème c'est un peu prendre un marteau pour écraser une mouche..

    Quant au problème de découper en triangles un polygone, le poids tient au fait que chque sommet participe pour 3 fois aux calculs : 2 fois à chaque extrémité de la base et 1 fois en tant que sommet du triangle..
    C'etait juste pour signaler son existence, tu as oublié de reprendre le
    Citation Envoyé par jabbounet
    mais elle est moins efficace que celle de souviron je pense.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #7
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Si O est le point & P1...Pn le polygone, sommer les angles consécutifs PiOPi+1. Si congru à 2pi, c'est dedans.
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    Si O est le point & P1...Pn le polygone, sommer les angles consécutifs PiOPi+1. Si congru à 2pi, c'est dedans.
    Ca m'a l'air bien robuste aux erreurs d'arrondi ca.

    Sinon je propose (encore et toujours) mon ami le Winding Number.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Salut!

    Citation Envoyé par Nemerle Voir le message
    Si O est le point & P1...Pn le polygone, sommer les angles consécutifs PiOPi+1. Si congru à 2pi, c'est dedans.
    C'était la première idée de Rodrigue, et comme l'a dit souviron34, ça ne fonctionne que sur des polygones convexes (enfin en tout cas sur des polygones un peu tordu, ça ne marche plus)... mais bon ça dépend aussi des besoin de Rodrigue, si ça se trouve on cherche compliqué alors que ces polygones sont peut-être des polygones réguliers...

    Sinon je propose (encore et toujours) mon ami le Winding Number.
    Juste pour info, tu l'appliquerais comment dans le cas présent?
    J'ai rapidement lu ce que c'était sur Wikipedia et apparemment, il faut connaître une équation paramétrique de la courbe, donc ici ce serait quoi l'idée? paramétrer tous les segments qui forment le polygone pour pouvoir ensuite appliquer l'algo tranquillement?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par magelan Voir le message
    Juste pour info, tu l'appliquerais comment dans le cas présent?
    J'ai rapidement lu ce que c'était sur Wikipedia et apparemment, il faut connaître une équation paramétrique de la courbe, donc ici ce serait quoi l'idée? paramétrer tous les segments qui forment le polygone pour pouvoir ensuite appliquer l'algo tranquillement?
    Ah quel dommage. T'as pris le 1er lien dans Google, et ta réponse était dans le second : winding number
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Ah quel dommage. T'as pris le 1er lien dans Google, et ta réponse était dans le second : winding number
    Ca m'apprendra à être fainéant...

    du coup c'est out de suite plus simple à implémenter, elle me plaît bien cette méthode!
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  12. #12
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Citation Envoyé par magelan Voir le message
    C'était la première idée de Rodrigue, et comme l'a dit souviron34, ça ne fonctionne que sur des polygones convexes (enfin en tout cas sur des polygones un peu tordu, ça ne marche plus)...
    Pas vrai, cela fonctionne avec n'mporte quel polygone! Petit oubli de ma part, la somme des angles doit être de la forme 2*k*pi avec k IMPAIR.

    Pseudocode, le problème des arrondis ne doit effectivement pas être sous-estimé
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    Pas vrai, cela fonctionne avec n'mporte quel polygone! Petit oubli de ma part, la somme des angles doit être de la forme 2*k*pi avec k IMPAIR.
    Oui j'ai parlé un peu vite, c'est juste (surtout avec le rajout)...
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    C'etait juste pour signaler son existence, tu as oublié de reprendre le
    j'avais pas oublié, j'avais mis des smileys


    Citation Envoyé par pseudocode Voir le message
    Ah quel dommage. T'as pris le 1er lien dans Google, et ta réponse était dans le second : winding number
    ce qui revient à l'algo cité, qui compte le nombre de traversées..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #15
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    ce qui revient à l'algo cité, qui compte le nombre de traversées..
    Oui et Non.

    Non, car le nombre de traversées (Crossing Number) ne tient pas compte du sens (trigo/horaire) du coté traversé. Ce qui pose un problème dans le cas de polygone croisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     _______________
    |    _____      |
    |   |     |     |
    |   |  X  |     |
    |   |_____|_____|
    |_________|
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Oui et Non.

    Non, car le nombre de traversées (Crossing Number) ne tient pas compte du sens (trigo/horaire) du coté traversé. Ce qui pose un problème dans le cas de polygone croisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     _______________
    |    _____      |
    |   |     |     |
    |   |  X  |     |
    |   |_____|_____|
    |_________|
    c'est exact, mais j'avais "approximé" l'algo..

    Si tu le regardes de près, tu vois qu'il en tient compte (à cause des inégalités) ..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Comment savoir si un point est a l intérieur d un cercle (Urgent SVP)
    Par the rost dans le forum SIG : Système d'information Géographique
    Réponses: 2
    Dernier message: 12/05/2013, 23h29
  2. Savoir si un point se trouve dans un tétraèdre
    Par zenux dans le forum Mathématiques
    Réponses: 22
    Dernier message: 02/02/2009, 09h27
  3. Calcul vectoriel (savoir si un point est à l'intérieur d'un triangle)
    Par Invité dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/10/2008, 22h46
  4. Savoir si un point se trouve dans un objet convexe
    Par zenux dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 05/03/2008, 15h21
  5. savoir si 1 point est a l'intérieur d'un cercle ...
    Par skarladevobsy dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 23/05/2002, 18h14

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