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 :

Transformer une ligne en polygone


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Points : 17
    Points
    17
    Par défaut [Résolu] Transformer une ligne en polygone
    Bonjour,
    je suis actuellement en train de developper une application dans laquelle on peut tracer des lignes multiples... Chaque polyline est stockee dans un tableau de points. Il faut pouvoir selectionner ces lignes. Mon probleme est a ce niveau. Une polyline est trop fine pour etre selectionnee efficacement. Il me faudrait donc un algorithme pour 'l'entourer' dans un polygone. A noter que les lignes sont soit horizontales soit verticales. Il m'est aussi impossible d'encadrer cet element par un simple rectangle car cela serait trop grossier et pas assez performant. Le mieux est, je pense, d'elargir la ligne ds toute les direction avec un certain rayon. J'ai deja essayer d'ecrire quelques algos mais a chage fois j'ai des problemes au niveau des angles (qui font 90°). Les lignes se croisent. Mon algo se base sur les point precedents et suivants du polyline pour calculer le point central et le dedoubler. Si vous avez des idees ou des suggestion elle seront les bienvenues.
    Merci d'avance,

    Nico

  2. #2
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    Salut,

    D'abord une remarque :
    le probleme initial est juste de pouvoir selectionner une polyline ? Dans ce cas, une solution simple consiste a cacluler la distance minimum entre la polyline et le point clique, et a considerer que tu selectionne si cette distance est inferieure a une valeur que tu fixes en fonction de ton echelle. Ca se fait assez rapidement, car ce sont des segments de droite.


    Pour ton algo, ce que tu veux, en fait, c'est entourer une polyline par un polygone, tel que la distance du polygone a la polyline soit d'au moins un certain rayon 'r', c'est ca ?
    Si les segments sont horizontaux et verticaux, tu dois pouvoir t'en tirer avec une succesion de boites englobantes rectangulaires.
    Si ton premier point est en (x0,y0), et qu'il va dans la direction (ox), vers la droite, tu peux initialiser deux points du polygone a (x0-r, y0-r) et (x0-r,y0+r).
    Ensuite tu considere la direction du deuxieme segment. Si c'est vers le haut (je compte les y positivment vers le haut, a l'ecran c'est vers le bas), tu peux placer deux autres points a (x1+r,y1-r) et (x1-r,y1+r). Si c'est vers le bas, tu les places a (x1+r,y1+r) et (x1-r,y1-r). Tu me suis ? Apres, en fonction de la direction du segment courant et du segment suivant, tu peux determiner les coordonnees successives des sommets du polygone entourant la polyline.


    voila pour l'instant hesite pas a poser des questions si c'est pas clair.

    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Ok, j ai lu attentivement ta reponse et c'est exactement ce que je fais.
    L'algo est bon, les points sont bien places mais le probleme n'est pas la. Je t'explique. J'ai une polyline de disons 10 element stockee dans un tableau. Je cree donc un autre tableau de 20 pour le polygone. Ensuite je parcour le premier tableau et je rempli le second 2 par 2. Au point 0 correspondra le points 0 et n/2 du polygone. Et le probleme est la. Le polygone 'tourne' et ainsi parfois des fils se croisent. Je m explique. Le point 1 genera les points 1a et 1b. Le 2 les points 2a et 2b. Mais parfois il faut connecter 1a/2a et 1b/2b et d'autre fois 1a/2b 1b/2a. Ce qui fait que le polygone se recoupe. Et je n'arrive pas a savoir quand il faut faire les echange.

    ps: cela ne sert pas qu'a identifier les collisions mais aussi a determiner la zone a mettre a jour pour redessiner la ligne. En effet cette derniere doit etre completement contenu dans la zone et ne pas chevaucher (en gros je ne peu pas me contenter de la ligne)

    vala ^^

  4. #4
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    salut,

    En fait, je n'arrive pas a voir exactement ton probleme. Normalement, ca devrait etre possible de trouver les coord des points juste en fonction de l'angle (+pi/2 ou -pi/2) entre deux lignes consecutives, et des coordonnees du sommet courant.
    Peux-tu donner un exemple (simple, si possible), de confi qui te pose probleme ?

    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Ok une analyse plus approfondi sur papier m'a permis de soudre le probleme. Pour ce que ca interresse voici l'algo utilisé (en C++) pour les points intermediaire uniquement (ni le premier, ni le dernier). Pour chaque 'angle': f correspond au point precedent, t au suivant et m et le point central. cl et le tableau contenant la polyline. qpa le tableau qui stock le polygone. up et dn les indices correspondant a l'endroit du polygone actuellement modifie (au debut up vaut 0 et dn vaut 2*taille cl-1).

    Code : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
      // Parcourir les points
      for (uint i=0;i<cl.count();i++){
     
        // C'est le premier point
        if (i==0){ ... }
     
        // C'est le dernier point
        else if (i==cl.count()-1){ ... }
     
        // Ce point est encadre par 2 autres points
        else{
     
          // Obtenir les donnees
          fx = cl.at(i-1).x();
          fy = cl.at(i-1).y();
          mx = cl.at(i).x();
          my = cl.at(i).y();
          tx = cl.at(i+1).x();
          ty = cl.at(i+1).y();
     
          // Placer en fonction de l'angle (8 cas mais correspondent 2 a2)
          if      ( fx<tx  && fy<ty  ){
           qpa.setPoint(up++,mx+5,my-5);
           qpa.setPoint(dn--,mx-5,my+5); 
          }
          else if ( fx<tx  && fy>=ty ){ 
            qpa.setPoint(up++,mx-5,my-5);
            qpa.setPoint(dn--,mx+5,my+5); 
          }
          else if ( fx>=tx && fy<ty  ){ 
            qpa.setPoint(up++,mx+5,my+5);
            qpa.setPoint(dn--,mx-5,my-5); 
          }
          else if ( fx>=tx && fy>=ty ){  // else ?
            qpa.setPoint(up++,mx-5,my+5);
            qpa.setPoint(dn--,mx+5,my-5); 
          }
        }
      }

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Au fait merci Kangourou pour ton aide c'est toi qui m'a mis sur la voie :p
    A bientot sur ce forum j'espere
    Nico

  7. #7
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    pas de probleme, tu me rendras la pareille un jour.

    A+

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

Discussions similaires

  1. Transformer une ligne d'un fichier en parametre
    Par nina2007 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 11/11/2013, 14h11
  2. Transformer une ligne en colonne
    Par leyeno dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/05/2009, 11h05
  3. [Oracle 10.2g] Transformer une ligne en plusieurs
    Par madevilts dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2009, 10h48
  4. Réponses: 0
    Dernier message: 06/12/2007, 11h08
  5. Convertir une ligne en polygone texturé
    Par JohnSmith dans le forum SDL
    Réponses: 5
    Dernier message: 21/03/2007, 18h46

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