Ce qui suit est une classe que j'ai faite pour diviser une boîte englobante en plus petits morceaux.vecteur de définition de classe
class reticula
{
int _columnas;
int _renglones;
int _num_pixelotes;
vector<vector<Point> > Pixelotes;
public:
reticula():
_columnas(0),
_renglones(0),
_num_pixelotes(0),
Pixelotes(){};
/// crear la reticula con los valores deseados
reticula(vector<Point> verticesB, int renglon, int columna);
Size size(void);
vector<Point> en(int el_renglon, int la_columna);
~reticula(void);
};
reticula::reticula(vector<Point> verticesB, int renglon, int columna){
if(verticesB.size()!= 4){
cout<< "El vector debe tener las 4 esquinas del rectangulo a dividir"
<< endl;
throw 400; // es para mandar la exepción.
}
_columnas = columna;
_renglones = renglon;
_num_pixelotes = columna * renglon ;
Pixelotes.resize(_renglones * _columnas);
double dis_mayor, dis_menor;//con respecto a los ejes
Point dif_10;
Point dif_21;
Point dif_32;
Point dif_03;
double es_mayor, es_menor;
dif_10 = verticesB[1]-verticesB[0];
dif_21 = verticesB[2]-verticesB[1];
dif_32 = verticesB[3]-verticesB[2];
dif_03 = verticesB[0]-verticesB[3];
dis_mayor = norm(dif_10);
dis_menor = norm(dif_21);
es_mayor = dis_mayor/(double) _columnas;
es_menor = dis_menor/(double) _renglones;
Point aux;
Point aux2;
vector<Point> vertices_re((_columnas + 1)*(_renglones + 1));
for (int i = 0; i < _renglones; i++){
for(int j= 0; j < _columnas; j++){
for(int h=0; h < 4; h++){
aux = verticesB[0] + ((((double)j*dis_mayor) * dif_10) + (((double)i * dis_menor)*dif_21));
if(h=0){aux2= aux;}
else if(h=1){aux2= aux + (dis_mayor * dif_10);}
else if(h=2){aux2= aux + (dis_mayor * dif_10) + (dis_menor * dif_21);}
else if(h=3){aux2= aux + (dis_menor * dif_21);}
Pixelotes[i * _columnas + j].push_back(aux2);
}
}
}
}
Size reticula::size(void){
Size Total;
Total.width = _columnas;
Total.height = _renglones;
return Total;
}
vector<Point> reticula::en(int el_renglon, int la_columna){
if(el_renglon > _renglones|| la_columna> _columnas){
cout << " el renglon y la columna se deben encontrar dentro de los parametros "
<<endl;
cout<< _renglones<<" , "<<_columnas<<endl;
vector<Point> vacio;
vacio.push_back(Point(0,0));
return (vacio);
}
int busca;
busca = el_renglon * _columnas + la_columna;
}
Je veux créer un vecteur qui contient cette classe, mais je ne sais pas ce que je fais mal
vector<reticula> SoloReti(contours.size());
for(int g=0; g< SoloReti.size(); g++){
SoloReti[g].reticula(contours[g], 5,4);
}
Le compilateur g ++ indique « utilisation invalide de :: réticule réticule » quelqu'un peut-il me dire où est le problème?
Sur une note de côté, si votre matrice de vecteur est itéré souvent alors vous êtes beaucoup mieux allouer un vecteur dans un seul gros morceau. Avec votre approche actuelle, chaque élément du vecteur de niveau supérieur (un vecteur en soi) effectuera une seconde allocation de tas pour le stockage, ce qui tue à peu près la localité des données. –
Merci pour la réponse, maintenant je comprends ce qui ne va pas dans le code. Et peut-être qu'il vaudra mieux mettre tout le point dans un seul vecteur, mais je pense qu'il sera utile de garder les points de cette manière pour référence future. – user1649814