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 :

Diagramme de Voronoï


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut Diagramme de Voronoï
    Bonjour à tous,

    Je me suis attaqué à réaliser un diagramme de Voronoï sous Python tkinter, je cherche donc à obtenir un canevas de ce type :
    Nom : voronoi.jpg
Affichages : 6180
Taille : 24,6 Ko

    Voilà où j'en suis, une capture d'écran de mon canevas, avec peu de points pour y voir clair.
    Nom : canevas.jpg
Affichages : 3196
Taille : 5,4 Ko

    J'ai donc mes points de zones en jaune. Pour délimiter les zones que l'on peut voir sur la première image, j'ai eu besoin de cercles minimum et de cercles circonscrit.
    Les centres de ces cercles circonscrits sont vert, les milieux entre chaque points sont rouge.

    Pour tracer les délimitations de ces zones, je vais relier certains de ces centres et milieux entre eux, et avec le bord de mon canevas.

    La petite aide dont j'aurais besoin concerne cette partie : relier certains de ces centres et milieux entre eux.
    Comment trier les bonnes des mauvaises délimitations ?
    Je ne cherche pas la réponse exacte, mais juste une idée de méthode. Je ne cherche pas non plus un algorithme super optimisé, je programme ça moi même.

    Merci de m'avoir lu

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Étrange de construire tout un tas de points, et se demander, après coup, à quoi ils peuvent servir.

    En quoi la page wikipédia sur le sujet ne te comble-t-elle pas ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    effectivement c'est une étrange représentation du diagramme de voronoi

    le graphe de voronoi est normalement un segment de droite passant par le centre d'une droite défini par deux point et perpendiculaire à celle-ci
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par anapurna Voir le message
    le graphe de voronoi est normalement un segment de droite passant par le centre d'une droite défini par deux point et perpendiculaire à celle-ci
    Même des élèves de sixième ne font pas ce genre d'erreurs !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    ouais bon le centre d'un segment de droite défini par deux point si tu préfère
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Je ne sais pas si leododo a avancé dans son projet.

    Quand on n'a que 2 points, c'est simple. La droite qui va couper le plan en 2 est la MEDIATRICE des 2 points. L'étape n°1, c'est donc de faire une fonction qui va permettre de trouver la droite médiatrice à partir de 2 points.
    Après , quand on a plus de 2 points, c'est un peu plus compliqué. Il va falloir faire par exemple une autre fonction qui va donner le point d'intersection à partir de 2 équations de droites.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Merci pour vos réponses.

    Citation Envoyé par Flodelarab Voir le message
    En quoi la page wikipédia sur le sujet ne te comble-t-elle pas ?
    La transcription mathématique programmation me pose soucis, et je préfère comprendre de que je fais

    Citation Envoyé par tbc92
    L'étape n°1, c'est donc de faire une fonction qui va permettre de trouver la droite médiatrice à partir de 2 points.
    J'ai suis en train de réaliser ça, je vous transmet mon avancement

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Re-bonjour,

    J'ai réalisé ma fonction médiatrice, en voici deux exemples :

    Nom : can1.png
Affichages : 3115
Taille : 2,7 Ko

    Nom : can2.png
Affichages : 3141
Taille : 6,0 Ko

    Citation Envoyé par tbc92 Voir le message
    Après, quand on a plus de 2 points, c'est un peu plus compliqué. Il va falloir faire par exemple une autre fonction qui va donner le point d'intersection à partir de 2 équations de droites.
    Je m'attaque à la réalisation de cette fonction .

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Le libriste que je suis se sent obligé de dire que, si ce que tu veux est un logiciel de géométrie, tu as kig comme logiciel libre, qui est très bien fait et extensible par du code python.

    Je m'attaque à la réalisation de cette fonction
    En ayant bien sûr mesurer que ce point est le centre du cercle circonscrit que tu sembles déjà avoir.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut,

    dans ta deuxième images on s'aperçois qu'il y a des zones inutiles
    il faut peut être optimiser
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Re bonjour, merci pour vos réponses, voilà où j'en suis

    Je reprends mes médiatrices :
    Nom : 2pts.png
Affichages : 2989
Taille : 2,2 Ko

    Ensuite :
    Citation Envoyé par tbc92
    Il va falloir faire par exemple une autre fonction qui va donner le point d'intersection à partir de 2 équations de droites.
    Citation Envoyé par Flodelarab
    En ayant bien sûr mesurer que ce point est le centre du cercle circonscrit que tu sembles déjà avoir.
    Citation Envoyé par anapurna
    On s'aperçois qu'il y a des zones inutiles.
    J'ai donc réalisé une fonction qui me trouve le point d'intersection, une seconde qui arrête le tracé de médiatrice jusqu'à ce point d'intersection :
    Nom : 3ptsO.png
Affichages : 3044
Taille : 2,0 Ko

    Malheureusement, le tracé de la médiatrice précédente devient partiellement faux :
    Nom : 3pts.png
Affichages : 2988
Taille : 3,1 Ko

    Donc ça devient vite le bazar ensuite ( même si cela ressemble plus à un diagramme de Voronoï ):
    Nom : 7pts.png
Affichages : 3202
Taille : 3,8 Ko

    Ce que j'ai essayé : J'ai détecté la médiatrice erronée, et essayé de la retracer en fonction du point d'intersection, mais ce fut un échec car le nouveau tracé dépends d'autres points aux alentours de ce point d'intersection, qui varient suivant la zone du diagramme.

    Donc mon nouveau problème est cette 'mise à jour' des médiatrices existantes.
    Merci de m'avoir lu.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Pour vous cibler un peu plus, ce que j'essaye de réaliser est une méthode incrémentale, se rapprochant de l'algorithme de Green et Sibson.https://commons.wikimedia.org/wiki/F...een_sibson.svg

    Seulement, c'est difficilement compréhensible.
    Pour l'instant mon programme se divise comme cela :

    - Une fonction points(), posant les points sur le diagramme.
    - Une fonction proximité(), qui détermine le point le plus proche du dernier point placé. Cette fonction fait appel à une fonction distance() calculant l'écart entre deux points.
    - Une fonction médiatrice(), traçant la médiatrice d'un segment défini par deux points. Cette fonction fait appel à une fonction prolongation(), qui prolonge deux fois un vecteur à partir d'un point d'application, d'une direction et de deux sens.

    Voilà

  13. #13
    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
    Pourquoi tout simplement ne pas faire une triangulation incrémentale de Delaunay ?? (pleins de codes existent, et j'ai le mien aussi, il me semblait quelque part dans la rubrique Contribuez, mais je ne suis plus sûr)

    Les points du Voronoi sont simplement les milieux des arêtes des triangles, qu'il suffit alors de joindre (je crois que dans Graphics Gems il y a un code)
    "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

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Merci pour la réponse.

    J'ai trouvé cela :
    http://www.developpez.net/forums/d48...-incrementale/
    http://www.realtimerendering.com/res...msiv/delaunay/

    Je vais essayer de comprendre et de reprendre mon code.

  15. #15
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    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 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Sur la base de ce que tu as déjà fait, voici des éléments pour continuer.
    Pour chaque couple de point A B, tu sais déterminer la médiatrice M(A,B). Une idée est de déterminer cette médiatrice en prenant 2 points très loin (de part et d'autre de notre groupe de points)

    On va en effet traiter des segments, et pas des droites.

    - A partir de M(A,B) et M(A,C), on sait calculer leur point d'intersection X. Et donc on va pouvoir nettoyer un peu. Sur la médiatrice M(A,B), il y a au plus un des 2 segments qui sera repris dans le diagramme de Voronoï. Soit le Segment qui part de X vers l'extrémité A, soit le segment qui part de X vers l'extrémité 2. Et une des étapes de l'algorithme, ça va être de déterminer quel segment est à conserver, et quel segment est à rejeter. Comment choisir lequel des 2 segments est pertinent ?

    Et en bouclant sur tous les couples de médiatrices, tu vas bâtir des segments de plus en plus adaptés.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  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
    Je me permet de penser que ça va être un peu essais/erreurs, alors que la solution en partant de Delaunay, est , par construction, intrinsèquement unique et juste..

    C'est la définition même...

    https://en.wikipedia.org/wiki/Delaunay_triangulation

    The Delaunay triangulation of a discrete point set P in general position corresponds to the dual graph of the Voronoi diagram for P



    D'ailleurs, le code fourni par pseudocode l'illustre bien dès le premier post de la première discussion qu'il a trouvé..
    "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

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par tbc92
    Pour chaque couple de point A B, tu sais déterminer la médiatrice M(A,B). Une idée est de déterminer cette médiatrice en prenant 2 points très loin (de part et d'autre de notre groupe de points)
    Et bien, j'ai pu utiliser les bords de mon canevas afin de récupérer deux points éloignés. En reliant ces deux points, j'ai pu obtenir cette médiatrice

    Citation Envoyé par souviron34
    La solution en partant de Delaunay, est , par construction, intrinsèquement unique et juste.
    Citation Envoyé par tbc92
    Comment choisir lequel des 2 segments est pertinent ?
    Et bien, en lisant la triangulation de Delaunay, je peux sélectionner les segments à partir du moment où ils relient deux barycentres, centres de cercles circonscrits ne contenant aucuns autres points.

    Cela m'a donné ( les cercles circonscrits blancs sont ceux n'étant pas retenus ) :
    Nom : canA.png
Affichages : 2948
Taille : 10,9 Ko
    Et ces fameux segments relient les points rouges (barycentres retenus) entre eux, et les points rouges avec les bords du canevas.

    En combinant avec vos précieuses réponses, j'ai pu avancer vers ceci :
    Nom : canB.png
Affichages : 3024
Taille : 6,5 Ko
    C'est pas terrible, mais toujours mieux qu'avant.

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

Discussions similaires

  1. Python 3.3 Tkinter Entrées contrôlées
    Par luc pic dans le forum Tkinter
    Réponses: 11
    Dernier message: 04/10/2014, 13h38
  2. Projet ISN Python programme Piano Tkinter
    Par Biloute42 dans le forum Programmation multimédia/Jeux
    Réponses: 4
    Dernier message: 07/05/2014, 18h11
  3. Problème Python 2.7 Tkinter
    Par nicolivier dans le forum Général Python
    Réponses: 4
    Dernier message: 23/03/2013, 19h32
  4. Réponses: 1
    Dernier message: 09/12/2010, 19h50

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