// space.cc - Classe Space // nono - Programme du robot Efrei Robotique I1-I2 2004 // Copyright (C) 2004 Olivier Gaillard /// @file space.cc Etalonnage des distances et localisation de la balle #include "space.h" #include "group.h" #include "stdio.h" using namespace std; /// Constructeur /// @param imgHeight hauteur de l'image /// @param imgWidth largeur de l'image Space::Space (int imgWidth, int imgHeight) { Space::imgHeight = imgHeight; Space::imgWidth = imgWidth; Space::oconfig = OConfig::GetInstance (); tabY = NULL; tabX = NULL; } /// Destructeur Space::~Space () { } /// Cree un fichier gnuplot avec la courbe des points donnés par la courbe x et y void Space::CreateGnuPlotFile (int y) { FILE *file; double locY, locX; // Ouverture du fichier file = fopen("dataY", "w+"); // Parcours pour tous les pixels verticaux de l'image for (int i=0; i<296; i++) { GetLoc(0, i, locX, locY); fprintf(file, "%i\t%lf\n", i, locY); } // Fermeture du fichier fclose(file); // Ouverture du fichier file = fopen("dataX", "w+"); // Parcours de tous les pixels horizontaux for (int i=0; i<352; i++) { GetLoc(0, y, locX, locY); fprintf(file, "%i\t%lf\n", i, locX); } // Fermeture du fichier fclose(file); } /// Ajoute un point pour l'etalonnage void Space::AddSetupPoint(int x, int y, int distx, int disty) { SETUP_POINT setupPoint; setupPoint.x = x; setupPoint.y = y; setupPoint.distx = distx; setupPoint.disty = disty; setupTab.push_back(setupPoint); } /// Chargement des points a partir d'un fichier void Space::LoadFromFile() { // Parcours de tous les points du fichier dist for (int i=0; inbDistPoint; i++) AddSetupPoint(oconfig->tabPoint[i*4+0], oconfig->tabPoint[i*4+1], oconfig->tabPoint[i*4+2], oconfig->tabPoint[i*4+3]); cout << "Nombre de points loadé pour le calibrage de la distance: " << setupTab.size () << endl; } /// Donne les coefficients d'une ligne void Space::FindCoeffLine (double x1, double y1, double x2, double y2, double &a, double &b) { a = (x2 - x1) / (y2 - y1); b = x1 - a * y1; } /// Etalonnage des distances int Space::Setup(double a, double b, double c) { // Assignation des coefficients pour le calcul des y aY = a; bY = b; cY = c; double a1, b1, a2, b2; // Cherche les coordonnées de 2 droites FindCoeffLine (65, 9, 118, 180, a1, b1); FindCoeffLine (198, 10, 192, 180, a2, b2); cout << a1 << " " << b1 << " " << a2 << " " << b2 << endl; // Allocation de la mémoire delete []tabY; tabY = new double[imgHeight]; delete []tabX; tabX = new double[imgHeight*imgWidth]; // Création du tableau de correspondance pour les x double diffPix; double unitPix; double center; for (int y=0; y