// map.cc - Classe Map // nono - Programme du robot Efrei Robotique I1-I2 2004 // Copyright (C) 2004 Olivier Gaillard /// @file map.cc Fourni la liste des balles presentes sur le terrain et permet le choix rapide et efficace de la prochaine balle a aller chercher #include "map.h" #include #include #include using namespace std; /// Constructeurs. Map::Map (OConfig *config, Space *space) { lock = 0; Map::config = config; Map::space = space; posGoal[0] = 105; posGoal[1] = 0; } /// Destructeur. Map::~Map (void) { } /// Accessors const std::list::iterator & Map::GetCurBall() { checkCurBall = false; return curBall; } /// Ajoute une balle a la map void Map::AddBall(int *pos, ZONE *pZone) { BALL ballTmp; ballTmp.position[0] = pos[0]; ballTmp.position[1] = pos[1]; // definit la position de la balle ballTmp.zone = pos[0]%300 + (pos[1]%300)*7; ballTmp.partial = pZone->partial; ballTmp.skepticism = 0; // calcul du score partie ballTmp.preScore = config->distance_ball_goal_weight * Dist(pos, posGoal); ball.push_back(ballTmp); } /// Supprime une balle de la map void Map::DelBall(list::iterator &iter) { ball.erase(iter); } /// Test si une balle trouvee correspond a une balle de la map int Map::TestSimilarBall(ZONE *pBall, list::iterator &iter) { //TODO tester d'abord les zones et ensuite les pos for(iter = ball.begin(); iter != ball.end(); iter++) { int pos[2] = {pBall->centerx, pBall->centery}; if (Dist(iter->position, pos) < (iter->partial || pBall->partial)?config->map_error_part:config->map_error) return 1; } return 0; } /// Calcul de distance int Map::Dist(int *pos1, int *pos2) { int x = pos2[0]-pos1[0]; int y = pos2[1]-pos1[1]; return (int)sqrt((double)(x * x + y * y)); } /// Retourne si une balle est locke int Map::IsLock() { return lock; } /// Lock une balle pour savoir quel balle le robot suit void Map::SetLock(bool value) { lock = value; } /// Met a jour la map avec une nouvelle liste de balle void Map::AddBallsToMap(Group *group) { ZONE *pCur = group->zoneListBall; int pos[2]; while (pCur) { if (!IsLock()) { int posX, posY; space->GetLoc(pCur->centerx, pCur->centery, posX, posY); cout << "posX: " << posX << " posY: " << posY << endl; SetLock(true); } /* // TODO passer par la classe space pos[0] = pCur->centerx; pos[1] = pCur->centery; // Cherche si la balle est deja dans la liste list::iterator iCur; // Si la balle n'est pas dans la liste on l'ajoute if (!TestSimilarBall(pCur, iCur)) { AddBall(pos, pCur); } // Si elle l'est on incremente son marqueur de viabilite else { if (iCur->skepticism < config->skepticism_max) iCur->skepticism++; } */ pCur = pCur->next; } // TODO decremente d'autre marqueur // Detection de poteau ou de goal pCur = group->zoneListGoal; if (pCur) {} } /// Met a jour les scores void Map::UpdateMap() { // On met a jour tous les scores list::iterator iter; for(iter = ball.begin(); iter != ball.end(); iter++) { // iter->score = preScore // + config->distance_ball_robot_weight * distancerobot // + config->angle_ball_weight * // + config->ball_density_weight * // + config->ennemy_presence_weight * // + config->skepticism_weight * iter->skepticism // + config->ball_precision_weight * // + ... iter->partial; if ((iter->score > curBall->score) && (!IsLock())) curBall = iter; } } /// Affiche les balles de la map void Map::ShowBalls() { list::iterator iter; int i=0; cout << "balles:\n"; /// Parcours de la liste for(iter = ball.begin(); iter != ball.end(); iter++) { /// Affichage des infos de la balle cout << i << ": " << iter->position[0] << "\t" << iter->position[1] << endl; i++; } cout << endl; }