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 :

Organisation de points / vertices


Sujet :

Algorithmes et structures de données

  1. #1
    Membre actif Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Points : 219
    Points
    219
    Par défaut Organisation de points / vertices
    Bonjour à tous,

    Dans le cadre d'un petit algorithme de mon cru, il m'est nécessaire de trier des points 2D (comprendre vertices, représentés par des vecteurs de dim 2), de sorte à pouvoir tracer, dans l'ordre trigonométrique, un polygone non croisé, convexe ou concave.
    En gros, je balance un tas de points non triés et l'algo me sort la solution (ou l'une des possibles solutions) permettant de tracer une forme (2D), soit un std::vector trié des points donnés.

    Techniquement, je devrais être en mesure de réaliser un tel algo, mais après avoir passé un après-midi sur le sujet, je flanche. Une petite idée ou un indice de quelque-chose qui pourrait m'aider dans ma démarche ?


    Merci d'avance

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 746
    Points : 3 667
    Points
    3 667
    Par défaut
    Je n'ai pas testé, mais je dirais qu'on peut définir le centre du nuage de point et avec faire un trie sur le fait qu'un point à gauche d'un autre (en se positionnant vers le centre) est toujours plus grand.

  3. #3
    Membre actif Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Points : 219
    Points
    219
    Par défaut
    Bonjour, et merci pour ce retour.

    J'ai effectivement pensé à cette idée ; néanmoins, cette méthode à le défaut de devoir tester chaque point par rapport à tous les autres et non pas uniquement aux plus proches. La technique faisant intervenir le produit vectoriel, j'imagine qu'il existe une solution moins gourmande (même si ce n'est pas le premier objet de la question). Il me faudrait réaliser un dessin pour imager la chose mais techniquement, l'algo proposé ne garanti pas non plus que le polygone ainsi créé ne présente pas de croisements.

    Autant le préciser, j’admets, bien entendu, que le nuage de points donné autorise au moins une solution à la réalisation d'un polygone non croisé faisant intervenir l'ensemble des sommets.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 669
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 669
    Points : 10 674
    Points
    10 674
    Par défaut
    À vue de nez , il faut reprendre "je-ne-sais-plus-quel-algo" glouton pour construire l'enveloppe convexe (peut-être concave ) d'un nuage de points.

    En gros, tu sélectionnes un point initial. Et ensuite l'algo prend un autre point, teste certains critères (1) et si c'est bon trace une arête entre ce point choisi et le point précédent.
    Sinon, par exemple dans l'algo de triangulation de Delaunay (<- lien wiki en français) on sait comment refaire le maillage local.

    Pour toi, les critères (1) que je vois
    • Est-ce que cette nouvelle arête en coupe 1 autre ? (test d'intersection) - si oui, tu vas avoir un truc style A-B-C-D et c'est A-B et C-D qui se coupent. Tu refais A-D-B-C ou A-D-C-B ou ... en fonction de la position des points
    • Est-ce que cette nouvelle arête entre A et B a une distance similaire (à un delta près) à 2 arêtes qui relient A et B via un 3ième point C ? Si c'est la cas, il faut déterminer si cette nouvelle arête est à l'intérieur (on supprime cette arête et on retire/ réserve/ ... peut-être ce nouveau point) ou à l'extérieur de la forme (on supprime ces 2 arêtes et on retire/ réserve/ ... peut-être le point C)

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 120
    Points : 9 533
    Points
    9 533
    Par défaut
    Tu ajoutes un point A, proche du centre de tous les points.
    Pour chacun de tes points M(i), tu calcules l'angle entre l'horizontale et l'axe AM(i) : un angle entre 0 et 360° donc.
    Et tu tries tous tes points selon cet angle.
    Et c'est fini, les points dans cet ordre forment un contour conforme à ta demande.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    J'aime beaucoup ce dernier algorithme .
    D'autant plus que l'argument d'un nombre complexe est donnée par la formule : arg z = 2 * arctan( (Re(x) + |z| ) / Im(z) ) si z n'est pas un réel négatif ou nul (arg z = π, sinon). Le résultat est entre -π et π.
    Donc ici, l'angle du point est :

    Formule mathématique
    ou π si y=0 et x ≤ 0

    NB1 : L'origine ne doit pas être présente deux fois dans ta liste, sinon, c'est un polygone croisé.
    NB2 : Si des points ont le même angle, il faut les mettre dans l'ordre du module (distance de l'origine aux points), croissant ou décroissant..

  7. #7
    Membre actif Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Points : 219
    Points
    219
    Par défaut
    Bonjour, et merci pour les retours.

    Effectivement, j'ai déjà implémenté quelque-chose de basé sur l'angle ET la longueur des vecteurs. Cependant, ce qui me chagrine, c'est comment refermer le polygone ? Cependant, je viens d'y penser, je n'étais pas vraiment placé au centre du nuage de points... Maintenant que je trace un dessin rapidement sur le papier avec une forme quelconque, je me dis que ça devrais marcher....

    Merci pour le tuyau qui me manquait ! Je teste ça cette fin de semaine et je vous dit ce qu'il en est.
    Si d'autres ont d'autres idées, je suis preneur. C'est toujours bien d'avoir plusieurs cordes à son arc.

    Merci encore !

  8. #8
    Membre actif Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Points : 219
    Points
    219
    Par défaut
    Bon, j'ai lancé un ou deux tests concluants sur des formes simples.
    Demain, je tenterais de faire ça sur un plus grands nombre de formes, mais je pense que le résultat sera positif.

    Pour info, j'ai réalisé ce bout de code de manière à essayer un "test de collision". En gros, savoir si un point est situé à l'intérieur ou à l'extérieur d'une surface donnée. Bien entendu, je sais qu'il existe d'autres algos pour ça mais je voulais valider la chose. On calcule l'aire de la surface initiale, puis l'aire de la surface initiale à laquelle on a ajouté le sommet à tester. Si l'aire est supérieure, alors le point est à l'extérieur de la forme, si l'aire est inférieure, alors le points est situé dans la forme.

    L'avantage que je vois à cette méthode par rapport à d'autres c'est que ce dernier peut traiter de formes concaves comme convexes.
    Inconvénient : cet algo est sûrement plus "lourd" en terme de ressources nécessaires ; en tout cas, c'est l'idée que je m'en fait là.
    Évolution potentielle pour traiter des formes 3D par calcul des volumes.

    Qu'en pensez-vous ?




    Edit : Non, en fait, cela ne peut fonctionner tel quel pour déterminer si un point est ou non à l'intérieur d'une forme. Ceci est limité aux formes convexes.
    Néanmoins, l'algorithme de tri / génération fonctionne tout de même et réponds à la question initiale... Ce dont j'ai besoin maintenant c'est de savoir comment intégrer un sommet à un polygone existant sans que le nouveau polygone soit croisé. Je vais réfléchir à nouveau au sujet...

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

Discussions similaires

  1. [XL-2010] Bug dabs Macro pour seuil vertical dans un nuage de points
    Par ThomasRoy72 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/09/2015, 11h28
  2. SAS 9.3 : Noms des points sur le graphique en VERTICAL
    Par sophie) dans le forum ODS et reporting
    Réponses: 6
    Dernier message: 03/03/2012, 10h22
  3. compression de données du point de vue algorithmique
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 26/06/2002, 15h51
  4. 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