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

Mathématiques Discussion :

Retrouver des faces dans un dessin géométrique


Sujet :

Mathématiques

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Retrouver des faces dans un dessin géométrique
    Bon je vais tacher d' être le plus clair possible, voila ma situation :
    - J'ai des point (je connais les coordonnées) avec chacun un numéro
    - Des lignes (je connais les deux point qui la compose) avec chacune un numéro

    Et moi je dois retrouver les différentes faces (une face est définie par les lignes qui la compsent) qui composent ma forme (un exemple sera bienvenu je pense)


    X : Numéro de ligne
    X : Numéro de point


    Donc ici mes face sont (6,5,7,9,3,13,11,12) et (10,11,13,8) et enfin (8,3,4,2,1)

    PS : Je dois le faire en python mais c'est surtout la démarche algorithmique qui me pose probleme ici... Alors si vous vous ennuyez : "A vos cerveau !!! Aidez moi s'il vous plait !"

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca ressemble beaucoup aux solutions apportées dans ce sujet:
    http://www.developpez.net/forums/d57...ion-polygones/
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    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
    Tu peux aussi énumérer tous les circuits du graphe, et conserver ceux qui n'ont pas de segments à l'intérieur.

    C'est plus long que l'union-find mais tu n'a pas besoin de passer par une représentation "bitmap" de ton dessin.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Tu peux aussi énumérer tous les circuits du graphe, et conserver ceux qui n'ont pas de segments à l'intérieur.
    C'est exactement mon objectif mais comment y parvenir c'est ça mon soucis... Et je ne VEUX pas passer par une image je n'ai que des coordonées dans un tableau ...

  5. #5
    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 Worm00 Voir le message
    C'est exactement mon objectif mais comment y parvenir c'est ça mon soucis...
    Déjà tu peux simplifier ton graphe. Seuls les points d'intersections nous interessent : ce seront les sommets du graphe. Les chemins entre les sommets (= les segments) seront les arcs du graphe.

    Pour énumérer les cycles, tu a plusieurs moyens. Le plus simple c'est de faire une exploration exhaustive des chemins. L'exploration peut se faire assez simplement avec la matrice d'adjacence (algo DFS + backtracking).

    Une fois que tu as les cycles, tu peux construire le polygone qui représente la face. Il reste à tester si un autre segment est à l'intérieur. Pour cela, il faut tester si un point du segment (par ex. le milieu) est dans le polygone (sujet déjà traité a fond dans ce forum).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Mes Points sont déjà tous point d'intersection puisque j'ai affaire uniquement a des formes géométriques.
    Ok je vais essayer de voir ça. Le truc c'est que je connais rien en backtracking...

    PS : Je ne comprend pas pourquoi il faut combiner backtrack et DFS ... Peut tu m'éclairer ?

  7. #7
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    AAAAh je crois avoir saisi ! Dit moi si j'ai tort s'il te plait...
    Bon en fait j'avais déjà commencer a codé un truc et je viens de me rendre compte que c'était un DFS que j'inventai là sans le savoir... Donc je me retrouve avec un liste de point, c'est là qu'intervient le backtrack non ? en gros je dois tester si le point précédent est bien voisin sinon retourner en arrière jusqu'à en trouver un non ? Du coup je me retrouverai avec une liste du circuit si je ne m'abuse.

    PS : D'abord tester si le suivant est voisin sinon cela signifie que j'ai fait un tour.

  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 Worm00 Voir le message
    Mes Points sont déjà tous point d'intersection puisque j'ai affaire uniquement a des formes géométriques.
    Je voulais dire uniquement les points qui sont une bifurcation (rencontre de au moins 3 segments). Les autres n'interviennent pas dans la détermination des circuits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +-------+
    |       |
    0---1   |
    |   |   |
    2---3---4
    |       |
    +-------+
    PS : Je ne comprend pas pourquoi il faut combiner backtrack et DFS ... Peut tu m'éclairer ?
    AAAAh je crois avoir saisi ! Dit moi si j'ai tort s'il te plait...
    Voila, tu as compris le truc... Tu dois construire tous les chemins possibles dans ton graphe et stocker ceux qui forment un circuit, c'est-à-dire ceux qui reviennent au point de départ.

    Comme tu veux déterminer des surfaces, il faut prendre les circuits de longueur au moins 3. Et comme tu veux des surfaces simples (non croisées), il faut prendre les circuits qui sont composés de points différents. Donc les circuits ne peuvent avoir plus de N points (N = nombre de sommets du graphe)

    Tout cela permet de construire l'algo : on a une condition d'arrêt (longueur<=N), on a une règle de construction (ajouter des des points qui ne sont pas déjà dans le chemin) et on a un état final (le chemin revient au point de départ). Cela doit prendre une dizaine de lignes en récursif.

    Ne pas oublier de supprimer les doublons : des circuits identiques au sens de parcours près, ou au point de départ près.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    A oui pas bête cette histoire d'au moins 2 segment j'aurais du y penser... Donc pour résumer je dois repéré tout mes point d' "intersection" effectuer autant de DFS que ce que j'ai de point d'intersection (en commençant a chaque fois avec un différent) je me retrouve alors avec un liste par point d'intersection, de chacune de ces liste j'extrais mes circuit grace au backtrack.

    C'est bien ça ? Si oui, la prochaine fois que j'écris dans ce topic c'est pour confirmer que tout a été codé avec succès j'espère.

  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 Worm00 Voir le message
    A oui pas bête cette histoire d'au moins 2 segment j'aurais du y penser... Donc pour résumer je dois repéré tout mes point d' "intersection" effectuer autant de DFS que ce que j'ai de point d'intersection (en commençant a chaque fois avec un différent) je me retrouve alors avec un liste par point d'intersection, de chacune de ces liste j'extrais mes circuit grace au backtrack.
    C'est bien cela.

    Pour être exact, tu extrais tes circuits grâce au DFS (le backtrack c'est juste une manière d'écrire un algo de DFS).

    Un petit exemple en java pour cette partie de l'algo:
    Code java : 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
    22
     
    /**
     * @param path list of vertex in the current path
     * @param len length of the current path
     * @param used flag for used vertex
     * @param cycles list of path found so far
     */
    private void findcycle(int[] path, int len, boolean[] used, List<int[]> cycles) {
    	if (len>N) return; // no more possible path
     
    	if (len>2 && matrix[path[len-1]][path[0]]) { // found a cycle
    		addCycle(cycles, Arrays.copyOf(path, len));
    	}
     
    	for(int i=0;i<N;i++) { // add a vertex to the path
    		if (used[i]) continue;
    		if (len>0 && !matrix[path[len-1]][i]) continue;
    		path[len]=i; used[i]=true;
    		findcycle(path,len+1,used,cycles);
    		used[i]=false;
    	}
    }

    Appelée par un code du genre:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<int[]> cycles = new ArrayList<int[]>();
    int[] path = new int[N];
    boolean[] used = new boolean[N];
    findcycle(path,0,used,cycles);

    Avec:
    N : le nombre de sommets du graphe
    matrix[][] : la matrice d'adjacence
    addCycle() : méthode qui ajoute le "path" dans la liste (avec detection de doublon)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Waw super ! Bon c'est plus ou moins ce que je devrais avoir a la fin sauf que je n'utilise pas de matrice d'adjacence... Je me suis rendu compte que je suis stupide ... j'ai pas pensé a utiliser CONTINUE !!!

    PS : pseudocode tu gères du steak ! En même temps les montpellierains sont les meilleurs en programmation

  12. #12
    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 Worm00 Voir le message
    Waw super ! Bon c'est plus ou moins ce que je devrais avoir a la fin sauf que je n'utilise pas de matrice d'adjacence... Je me suis rendu compte que je suis stupide ... j'ai pas pensé a utiliser CONTINUE !!!
    L'utilisation des early-exit (break, continue, return ...) est assez mal vue par les "experts" en programmation. Je n'ai jamais bien compris pourquoi. Ça ne m'empêche pas d'en abuser assez souvent.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    L'utilisation des early-exit (break, continue, return ...) est assez mal vue par les "experts" en programmation. Je n'ai jamais bien compris pourquoi. Ça ne m'empêche pas d'en abuser assez souvent.
    Oui c'est vrai que en cours jamais on nous en parle mais moi je me dit que si quelqu'un l'as inventé il faut l'utiliser

  14. #14
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    En fait le système de ne traiter que les points d'intersection c'est une très mauvaise idée car je peux tout à fait tomber sur une seule face et dans ce cas tout les point on seulement 2 lignes qui en partent

    PS : J'ai fini merci pour tout . Franchement pour mon premier passage sur ce forum je suis très content ! Voilà une communauté de programmeur compétente, ça fais plaisir . Je reviendrai c'est sûr !

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

Discussions similaires

  1. [SP2010] Comment retrouver des webparts dans un site ?
    Par rigol'man dans le forum Développement Sharepoint
    Réponses: 8
    Dernier message: 27/05/2014, 11h10
  2. dessiner des trais dans un QRepot
    Par devlopassion dans le forum C++Builder
    Réponses: 2
    Dernier message: 21/11/2006, 11h46
  3. Réponses: 6
    Dernier message: 01/08/2006, 18h45
  4. Réponses: 7
    Dernier message: 04/06/2006, 17h00
  5. Dessiner des formes dans un formulaire
    Par karimspace dans le forum Access
    Réponses: 3
    Dernier message: 30/12/2005, 14h24

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