2009-04-08 10 views
0

je le foncteur suivant pour redéfinir l'opérateur moins de la méthode de tri pour le type de vecteur:dans la définition du foncteur

typedef vector< vector<int> > MxInt2d; 
typedef vector< vector<double> > MxDouble2d; 

class QSweep{ 
public: 
.... 
static MxDouble2d myPoints_; 
    MxDouble2d myEdges_; 

class order{ 
public: 
    bool operator() (const vector<int>& edge1, const vector<int>& edge2){ 
     //std::cout<<"inside sort"<<endl; 
     //3 sort criteria 
     return (myPoints_[edge1[0]][0]<myPoints_[edge2[0]][0])|| 
          (myPoints_[edge1[0]][0]==myPoints_[edge2[0]][0]&& 
          myPoints_[edge1[0]][1]<myPoints_[edge2[0]][1]) 
       || 
       (myPoints_[edge1[0]][0]==myPoints_[edge2[0]][0]&& 
          myPoints_[edge1[0]][1]==myPoints_[edge2[0]][1]&& 
       getSlope(myPoints_[edge1[0]][0],myPoints_[edge1[0][1], 
             myPoints_[edge1[1]][0],myPoints_[edge1[1]][0]) 
       < 
          getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],  
             myPoints_[edge2[1]][0],myPoints_[edge2[1]][0])); 
      } 
}; 
static double getSlope(double a, double b, double c, double d); 

}; 

où getSlope est une fonction définie de la manière suivante:

double QSweep::getSlope(double a, double b, double c, double d){ 
double slope=0.0; 
//std::cout<<"slope criteria"<<endl; 
double denum=c-a; 
if (denum==0){ 
    std::cout<<"zero denominator"<<endl; 
} 
else{ 
    slope=(d-b)/denum; 
} 
return slope; 
} 

Chaque point est donné par un index, une coordonnée x et ay; Chaque arête est donnée par l'arête source [0] et l'arête de destination [1], où arête [0], arête [1] sont les index des points). Je veux arranger le bord: - par la coordonnée x de leurs coordonnées de bord [0] (si les x de 2 arêtes sont différentes) - par la coordonnée y de leur bord [0] coordonnée (si les x de 2 les arêtes sont égales) - par leurs pentes correspondantes (si les x des arêtes et les y des arêtes sont égaux).

Je déclare la fonction getSLope statique, mais quand je trier les bords avec

sort(myEdges_.begin(),myEdges_.end(),order()); 

la dernière condition n'est pas REMPLI. si j'ai deux arêtes avec les mêmes x et y pour edgep [0] mais avec des pentes différentes, par ex. pente (edge1) = 1, pente (edge2) = 1/2 que je voudrais obtenir [edge2, edge1]; Au lieu de cela, j'obtiens [edge1, edge2]. Donc, mes critères getSlope ne sont pas calculés.

est-ce parce que j'ai déclaré getSlope statique? Que devrais-je changer pour que les critères soient remplis? merci d'avance pour vos suggestions, madalina

Répondre

0

Peut-être que c'est arrivé parce que le résultat de l'expression pourrait être calculé sans elle.
.: par exemple

false && someFunction(); - function will not be called 
true || someFunction(); - function will not be called 

C'est bien la règle, il nous permet d'écrire suivant:

if (ptr && ptr->someMethod()) 
// call method will not be called for NULL pointers 
+0

Je crois avoir faux && someFunction() (bool && bool) madalina

+0

Vérifiez cela avec le débogueur ou imprimez des parties de l'équation. si oui - someFunction() bayda

1

crikey! Cela semble assez complexe, d'abord avez-vous essayé avec un ensemble de valeurs moins complexe à calculer - c'est-à-dire que je vois que vous avez des instructions de cout, je crois qu'elles fonctionnent correctement lorsque vous l'exécutez?

Si oui, peut Iut être que vos entrées à getSlope sont fausses - ne devraient pas

getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],  
     myPoints_[edge2[1]][0],myPoints_[edge2[1]][0]) 

être

getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],  
     myPoints_[edge2[1]][0],myPoints_[edge2[1]][1]) 
+0

OUI !! c'était un mauvais index pour edge2 [1]. Merci.yepp il semble assez complexe. – madalina

+0

mon plaisir. Donne-moi un point, donne-moi un point :) – gbjbaanb

Questions connexes