Tri vecteur de point 3D par abscisse

Tri vecteur de point 3D par abscisse - C++ - Programmation

Marsh Posté le 03-12-2009 à 19:43:40    


Salut les djeuns,
 
j'ai une difficulté à surmonté. Je souhaite trier un vector<PointType> monVecteur par abscisse croissante ou decroissante, peu importe.
PointType est un type défini sous ITK ainsi typedef itk::Point<double,3> PointType;
 
- Peux t'on employer la fonction sort de std vector pour trier un vecteur à 3 dimension en fonction d'une des composantes?
 
- Qu'elle serait la façon la plus rapide de trier ce vecteur de points en fonction des abscisses.
 
- J'ai tenté de faire un tri bulle mais ça cloche. Je suis encore un novice en c++ donc probable que je m'y prenne mal au niveau des structures de données.
Le résultat ne me parait pas correcte non plus? Merci de m'apporter vos lumières :bounce:  
 
 void echanger(vector<PointType> tableau, const int i, const int j)
 {
    int temporaire1,temporaire2,temporaire3;
    temporaire1 = tableau[i][0];
    temporaire2 = tableau[i][1];
    temporaire3 = tableau[i][2];
     
    tableau[i][0] = tableau[j][0];
    tableau[i][1] = tableau[j][1];
    tableau[i][2] = tableau[j][2];
     
    tableau[j][0] = temporaire1;
    tableau[j][1] = temporaire2;
    tableau[j][2] = temporaire3;
 }
 
 void triABulle(vector<PointType> tableau,int longueur)
 {
 
    bool permutation;
 
    do
    {
       permutation = false;
       for(int i=0; i<longueur-1; i++)
       {
          if(tableau[i][0]>tableau[i+1][0])
          {
             echanger(tableau, i, i+1);
             permutation = true;
          }
       }
       longueur--;
    }
    while(permutation);
 }
 

Reply

Marsh Posté le 03-12-2009 à 19:43:40   

Reply

Marsh Posté le 03-12-2009 à 19:48:49    

Funkyfonk a écrit :


- Peux t'on employer la fonction sort de std vector pour trier un vecteur à 3 dimension en fonction d'une des composantes?


 
oui en lui passant un foncteur effectuant le test sur la compsoante qui t'interesse.

Reply

Marsh Posté le 03-12-2009 à 20:38:01    

Pour faire le tri sur ton vector tu peux utiliser ça :
 

Code :
  1. std::sort(vector.begin(), vector.end(), monComparateurLess);
  2. avec la fonction définie :
  3. bool monComparateurLess(PointType *p1, PointType *p2)
  4. {
  5.   // retourne true si p1 < p2 en fonction des critères que tu veux
  6. }


---------------
Martin
Reply

Marsh Posté le 03-12-2009 à 22:36:07    

sauf que tu prends des references et non des pointeurs ;)

Reply

Marsh Posté le 04-12-2009 à 10:48:20    

Pourquoi ne pas simplement implementer l`operateur < dans la classe PointType ?


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 04-12-2009 à 10:52:07    

kirua_sama a écrit :

Pourquoi ne pas simplement implementer l`operateur < dans la classe PointType ?


Semantiquement, pourquoi operator< testerait=il seulement l'abcisse ?
 
<moment prog. generique>
le bon plan serait d'avoir une class de predicat tempalte genre :
 

Code :
  1. template<int Idx> struct order_by_component;
  2. template<> struct order_by_component<1>
  3. {
  4.    bool operator ()( PointType const& a,PointType const& b) { return /* test sur x */; }
  5. };
  6. template<> struct order_by_component<2>
  7. {
  8.    bool operator ()( PointType const& a,PointType const& b) { return /* test sur y */; }
  9. };
  10. template<> struct order_by_component<3>
  11. {
  12.    bool operator ()( PointType const& a,PointType const& b) { return /* test sur z */; }
  13. };


</moment prog. generique>

Reply

Marsh Posté le 04-12-2009 à 11:27:32    

Effectivement, lu trop vite.
Ca resterait semantique que dans le cas on l`on aurait la norme |0P.
Sinon, juste une petite question dans ton cas pourquoi eviter le switch ?


---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”
Reply

Marsh Posté le 04-12-2009 à 13:50:34    

c moche les switch qd tu renvoit un truc qui se calcul en 1 cylce :o

Reply

Marsh Posté le 04-12-2009 à 18:31:50    


Je vous remercie pour toutes vos réponses.
 
Comme je l'ai mentionné, je suis novice en c++.
 
Alors j'ai testé une des solution proposé avec le sort mais je ne sais pas comment récupérer les indices;
 
 bool monComparateurLess(PointType p1, PointType p2)
 {
 if (p1[0]<p2[0])
     return true;
 else  
     return false;
 }
 
sort(vect.begin(), vect.end()-1, monComparateurLess(vect[vect.begin()],vect[vect.begin()+1]);
 
J'ai testé ceci mais en vain

Reply

Marsh Posté le 04-12-2009 à 19:16:07    

goto la doc :
 
http://www.sgi.com/tech/stl/functors.html
 
y a un exemple avec sort

Reply

Marsh Posté le 04-12-2009 à 19:16:07   

Reply

Marsh Posté le 06-12-2009 à 19:05:56    


Merci pour ce lien.
J'ai compris le fonctionnement de sort pour trier un vecteur d'entier.
Je ne vois pas comment l'employer pour trier un vecteur de point en fonction  
de l'abscisse.

Reply

Marsh Posté le 06-12-2009 à 19:15:17    

t'as lu jusqu'en bas ? y a un exemple sur les doubles :€

 

et je vois pas ce qui est difficile à comprendre dans

 
Code :
  1. strict sort_on_x
  2. {
  3.   bool operator()( PointType const& a0, PointType const& a1) const
  4.   {
  5.      return a0[0] < a1[0] ;
  6.   }
  7. }
  8. vector<PointType> v;
  9. sort(v.begin(),v.end(),sort_on_x());


Message édité par Joel F le 06-12-2009 à 19:16:56
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed