Time is good

Dependencies:   RoboClaw mbed

Fork of Robot2016_2-0 by ARES

Committer:
IceTeam
Date:
Wed May 04 23:35:03 2016 +0200
Revision:
60:8d2320a54a32
Parent:
57:86f491f5b25d
Child:
63:176d04975f06
Commit de test map/objectif

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IceTeam 47:be4eebf40568 1 #include "map.h"
IceTeam 47:be4eebf40568 2
IceTeam 57:86f491f5b25d 3 /* Dernier Changement : Romain 20h30 */
IceTeam 57:86f491f5b25d 4
IceTeam 47:be4eebf40568 5 map::map (Odometry* nodo) : Codo(nodo) {
IceTeam 47:be4eebf40568 6 }
IceTeam 47:be4eebf40568 7
IceTeam 47:be4eebf40568 8 void map::addObs (obsCarr nobs) {
IceTeam 47:be4eebf40568 9 obs.push_back (nobs);
IceTeam 47:be4eebf40568 10 }
IceTeam 60:8d2320a54a32 11 void map::addObj (objectif nobj) {
IceTeam 60:8d2320a54a32 12 objectifs.push_back(nobj);
IceTeam 60:8d2320a54a32 13 }
IceTeam 47:be4eebf40568 14
IceTeam 47:be4eebf40568 15 void map::FindWay (float depX, float depY, float arrX, float arrY) {
IceTeam 47:be4eebf40568 16 point depart(depX, depY);
IceTeam 47:be4eebf40568 17 point arrivee(arrX, arrY);
IceTeam 47:be4eebf40568 18 FindWay(depart, arrivee);
IceTeam 47:be4eebf40568 19 }
IceTeam 47:be4eebf40568 20
IceTeam 47:be4eebf40568 21 void map::FindWay (point dep, point arr) {
IceTeam 47:be4eebf40568 22 //logger.printf("On a cherche un chemin\n\r");
IceTeam 47:be4eebf40568 23 nVector<pointParcours> open;
IceTeam 47:be4eebf40568 24 nVector<pointParcours> close;
IceTeam 47:be4eebf40568 25 points4 tmp;
IceTeam 47:be4eebf40568 26 bool val[4] = {true,true,true,true};
IceTeam 47:be4eebf40568 27 int os = obs.size ();
IceTeam 47:be4eebf40568 28 int i, j;
IceTeam 47:be4eebf40568 29 bool ended=false; // On teste tous les points ajoutes dans l'open list pour savoir s'il y a intersection avec un obstacle. Ended passe à true quand aucun ne coupe un obstacle.
IceTeam 47:be4eebf40568 30 endedParc = false;
IceTeam 47:be4eebf40568 31
IceTeam 47:be4eebf40568 32 path.clear();
IceTeam 47:be4eebf40568 33
IceTeam 47:be4eebf40568 34 pointParcours depP (dep, NULL, arr);
IceTeam 47:be4eebf40568 35 int indTMP1=0; // Le point actuel
IceTeam 47:be4eebf40568 36 int PointEnding = 0;
IceTeam 47:be4eebf40568 37 open.push_back (depP);
IceTeam 47:be4eebf40568 38
IceTeam 47:be4eebf40568 39 while (!ended && !open.empty ()) {
IceTeam 47:be4eebf40568 40 for (i = 0; i < open.size (); ++i) {
IceTeam 47:be4eebf40568 41 if (open[i].getP2 () < open[indTMP1].getP2 ())
IceTeam 47:be4eebf40568 42 indTMP1 = i;
IceTeam 47:be4eebf40568 43 }
IceTeam 47:be4eebf40568 44
IceTeam 47:be4eebf40568 45 close.push_first (open[indTMP1]);
IceTeam 47:be4eebf40568 46 open.erase (indTMP1);
IceTeam 47:be4eebf40568 47 indTMP1 = 0;
IceTeam 47:be4eebf40568 48
IceTeam 47:be4eebf40568 49 ended = true;
IceTeam 47:be4eebf40568 50 for (i = 0; i < os; ++i) {
IceTeam 47:be4eebf40568 51 if (obs[i].getCroisement (close[indTMP1].getX (), close[indTMP1].getY (), arr)) {
IceTeam 47:be4eebf40568 52 ended = false;
IceTeam 47:be4eebf40568 53 tmp = obs[i].getPoints ();
IceTeam 47:be4eebf40568 54
IceTeam 56:4fd9636dfb36 55 // On vérifie si le point est sur la table
IceTeam 56:4fd9636dfb36 56 if (tmp.p0.getX() < min_x_table || tmp.p0.getY() < min_y_table || tmp.p0.getX() > max_x_table || tmp.p0.getY() > max_y_table)
IceTeam 56:4fd9636dfb36 57 val[0] = false;
IceTeam 47:be4eebf40568 58 // On vérifie si le point croise un obstacle
IceTeam 56:4fd9636dfb36 59 for (j = 0; j < os && val[0]; ++j)
IceTeam 47:be4eebf40568 60 if (obs[j].getCroisement (tmp.p0, close[indTMP1]))
IceTeam 47:be4eebf40568 61 val[0] = false;
IceTeam 47:be4eebf40568 62 // On vérifie si le point existe déjà dans la liste ouverte
IceTeam 56:4fd9636dfb36 63 for (j = 0; j < open.size () && val[0]; ++j) {
IceTeam 47:be4eebf40568 64 if (open[j] == tmp.p0)
IceTeam 47:be4eebf40568 65 val[0] = false;
IceTeam 47:be4eebf40568 66 }
IceTeam 47:be4eebf40568 67 // On vérifie si le point existe déjà dans la liste fermée
IceTeam 56:4fd9636dfb36 68 for (j = 0; j < close.size () && val[0]; ++j) {
IceTeam 47:be4eebf40568 69 if (close[j] == tmp.p0)
IceTeam 47:be4eebf40568 70 val[0] = false;
IceTeam 47:be4eebf40568 71 }
IceTeam 47:be4eebf40568 72 if (val[0]) {
IceTeam 47:be4eebf40568 73 open.push_back (pointParcours (tmp.p0, &close[indTMP1], arr));
IceTeam 47:be4eebf40568 74 }
IceTeam 47:be4eebf40568 75
IceTeam 47:be4eebf40568 76 // On repete l'operation pour le second point
IceTeam 56:4fd9636dfb36 77 if (tmp.p1.getX() < min_x_table || tmp.p1.getY() < min_y_table || tmp.p1.getX() > max_x_table || tmp.p1.getY() > max_y_table)
IceTeam 56:4fd9636dfb36 78 val[1] = false;
IceTeam 56:4fd9636dfb36 79 for (j = 0; j < os && val[1]; ++j)
IceTeam 47:be4eebf40568 80 if (obs[j].getCroisement (tmp.p1, close[indTMP1]))
IceTeam 47:be4eebf40568 81 val[1] = false;
IceTeam 56:4fd9636dfb36 82 for (j = 0; j < open.size () && val[1]; ++j) {
IceTeam 47:be4eebf40568 83 if (open[j] == tmp.p1)
IceTeam 47:be4eebf40568 84 val[1] = false;
IceTeam 47:be4eebf40568 85 }
IceTeam 56:4fd9636dfb36 86 for (j = 0; j < close.size () && val[1]; ++j) {
IceTeam 47:be4eebf40568 87 if (close[j] == tmp.p1)
IceTeam 47:be4eebf40568 88 val[1] = false;
IceTeam 47:be4eebf40568 89 }
IceTeam 47:be4eebf40568 90 if (val[1]) {
IceTeam 47:be4eebf40568 91 open.push_back (pointParcours (tmp.p1, &close[indTMP1], arr));
IceTeam 47:be4eebf40568 92 }
IceTeam 47:be4eebf40568 93
IceTeam 47:be4eebf40568 94 // On répète l'opération pour le troisième point
IceTeam 56:4fd9636dfb36 95 if (tmp.p2.getX() < min_x_table || tmp.p2.getY() < min_y_table || tmp.p2.getX() > max_x_table || tmp.p2.getY() > max_y_table)
IceTeam 56:4fd9636dfb36 96 val[2] = false;
IceTeam 56:4fd9636dfb36 97 for (j = 0; j < os && val[2]; ++j)
IceTeam 47:be4eebf40568 98 if (obs[j].getCroisement (tmp.p2, close[indTMP1]))
IceTeam 47:be4eebf40568 99 val[2] = false;
IceTeam 56:4fd9636dfb36 100 for (j = 0; j < open.size () && val[2]; ++j) {
IceTeam 47:be4eebf40568 101 if (open[j] == tmp.p2)
IceTeam 47:be4eebf40568 102 val[2] = false;
IceTeam 47:be4eebf40568 103 }
IceTeam 56:4fd9636dfb36 104 for (j = 0; j < close.size () && val[2]; ++j) {
IceTeam 47:be4eebf40568 105 if (close[j] == tmp.p2)
IceTeam 47:be4eebf40568 106 val[2] = false;
IceTeam 47:be4eebf40568 107 }
IceTeam 47:be4eebf40568 108 if (val[2]) {
IceTeam 47:be4eebf40568 109 open.push_back (pointParcours (tmp.p2, &close[indTMP1], arr));
IceTeam 47:be4eebf40568 110 }
IceTeam 47:be4eebf40568 111
IceTeam 47:be4eebf40568 112 // On répète l'opération pour le quatrieme point
IceTeam 56:4fd9636dfb36 113 if (tmp.p3.getX() < min_x_table || tmp.p3.getY() < min_y_table || tmp.p3.getX() > max_x_table || tmp.p3.getY() > max_y_table)
IceTeam 56:4fd9636dfb36 114 val[3] = false;
IceTeam 56:4fd9636dfb36 115 for (j = 0; j < os && val[3]; ++j)
IceTeam 47:be4eebf40568 116 if (obs[j].getCroisement (tmp.p3, close[indTMP1]))
IceTeam 47:be4eebf40568 117 val[3] = false;
IceTeam 56:4fd9636dfb36 118 for (j = 0; j < open.size () && val[3]; ++j) {
IceTeam 47:be4eebf40568 119 if (open[j] == tmp.p3)
IceTeam 47:be4eebf40568 120 val[3] = false;
IceTeam 47:be4eebf40568 121 }
IceTeam 56:4fd9636dfb36 122 for (j = 0; j < close.size () && val[3]; ++j) {
IceTeam 47:be4eebf40568 123 if (close[j] == tmp.p3)
IceTeam 47:be4eebf40568 124 val[3] = false;
IceTeam 47:be4eebf40568 125 }
IceTeam 47:be4eebf40568 126 if (val[3]) {
IceTeam 47:be4eebf40568 127 open.push_back (pointParcours (tmp.p3, &close[indTMP1], arr));
IceTeam 47:be4eebf40568 128 }
IceTeam 47:be4eebf40568 129
IceTeam 47:be4eebf40568 130 val[0] = true;
IceTeam 47:be4eebf40568 131 val[1] = true;
IceTeam 47:be4eebf40568 132 val[2] = true;
IceTeam 47:be4eebf40568 133 val[3] = true;
IceTeam 47:be4eebf40568 134 }
IceTeam 47:be4eebf40568 135 }
IceTeam 47:be4eebf40568 136 }
IceTeam 47:be4eebf40568 137
IceTeam 47:be4eebf40568 138 /* L'algorithme n'est pas bon. Je devrais prendre ici le plus court chemin vers l'arrivée pour ceux qui ne sont pas bloqués, et pas un aléatoire ... */
IceTeam 47:be4eebf40568 139 if (ended) {
IceTeam 47:be4eebf40568 140 pointParcours* pente;
IceTeam 47:be4eebf40568 141 pente = &close[0];
IceTeam 47:be4eebf40568 142 while (pente != NULL) {
IceTeam 47:be4eebf40568 143 path.push_first (*pente);
IceTeam 47:be4eebf40568 144 pente = pente->getPere ();
IceTeam 47:be4eebf40568 145 }
IceTeam 47:be4eebf40568 146 path.push_back (pointParcours(arr, NULL, arr));
IceTeam 47:be4eebf40568 147 path.erase(0);
IceTeam 47:be4eebf40568 148 endedParc = true;
IceTeam 47:be4eebf40568 149 /*
IceTeam 47:be4eebf40568 150 if (path.size() > 1)
IceTeam 47:be4eebf40568 151 path.erase(0);*/
IceTeam 47:be4eebf40568 152 }
IceTeam 47:be4eebf40568 153 }
IceTeam 47:be4eebf40568 154
IceTeam 47:be4eebf40568 155 void map::Execute(float XObjectif, float YObjectif) {
IceTeam 47:be4eebf40568 156 logger.printf("Findway %f-%f -> %f-%f\n\r", Codo->getX(), Codo->getY(), XObjectif, YObjectif);
IceTeam 47:be4eebf40568 157 FindWay (Codo->getX(), Codo->getY(), XObjectif, YObjectif);
IceTeam 47:be4eebf40568 158
IceTeam 47:be4eebf40568 159 if (endedParc) {
IceTeam 47:be4eebf40568 160 //logger.printf("\n\r");
IceTeam 47:be4eebf40568 161 for (int i = 0; i < path.size (); i++) {
IceTeam 47:be4eebf40568 162 logger.printf("Goto %d/%d [%f, %f]... \n\r", i, path.size()-1, path[i].getX(), path[i].getY());
IceTeam 47:be4eebf40568 163 //the = (float) atan2((double) (p[i].gety() - odo.getY()), (double) (p[i].getx() - odo.getX()));
IceTeam 47:be4eebf40568 164 Codo->GotoXY((double)path[i].getX(), (double)path[i].getY());
IceTeam 47:be4eebf40568 165 logger.printf("Goto Fini\n\r");
IceTeam 47:be4eebf40568 166 }
IceTeam 47:be4eebf40568 167 //logger.printf("Chemin fini !\n\r");
IceTeam 47:be4eebf40568 168 }
IceTeam 47:be4eebf40568 169 else {
IceTeam 47:be4eebf40568 170 logger.printf("Chemin pas trouve ...\n\r");
IceTeam 47:be4eebf40568 171 }
IceTeam 47:be4eebf40568 172 endedParc = false;
IceTeam 57:86f491f5b25d 173 }
IceTeam 57:86f491f5b25d 174
IceTeam 60:8d2320a54a32 175 void map::Execute(int obj) {
IceTeam 57:86f491f5b25d 176 // logger.printf("Findway %f-%f -> %f-%f\n\r", Codo->getX(), Codo->getY(), XObjectif, YObjectif);
IceTeam 60:8d2320a54a32 177 Objectif o = objectifs[obj];
IceTeam 57:86f491f5b25d 178 FindWay (Codo->getX(), Codo->getY(), o.getX(), o.getY());
IceTeam 57:86f491f5b25d 179
IceTeam 57:86f491f5b25d 180 if (endedParc) {
IceTeam 57:86f491f5b25d 181 //logger.printf("\n\r");
IceTeam 57:86f491f5b25d 182 for (int i = 0; i < path.size (); i++) {
IceTeam 57:86f491f5b25d 183 // logger.printf("Goto %d/%d [%f, %f]... \n\r", i, path.size()-1, path[i].getX(), path[i].getY());
IceTeam 57:86f491f5b25d 184 //the = (float) atan2((double) (p[i].gety() - odo.getY()), (double) (p[i].getx() - odo.getX()));
IceTeam 57:86f491f5b25d 185 Codo->GotoXY((double)path[i].getX(), (double)path[i].getY());
IceTeam 57:86f491f5b25d 186 // logger.printf("Goto Fini\n\r");
IceTeam 57:86f491f5b25d 187 }
IceTeam 60:8d2320a54a32 188 Codo->gotoThet(o.getThet());
IceTeam 60:8d2320a54a32 189 o.Action();
IceTeam 57:86f491f5b25d 190 //logger.printf("Chemin fini !\n\r");
IceTeam 57:86f491f5b25d 191 }
IceTeam 57:86f491f5b25d 192 else {
IceTeam 57:86f491f5b25d 193 logger.printf("Chemin pas trouve ...\n\r");
IceTeam 57:86f491f5b25d 194 }
IceTeam 57:86f491f5b25d 195 endedParc = false;
IceTeam 60:8d2320a54a32 196 }
IceTeam 60:8d2320a54a32 197
IceTeam 60:8d2320a54a32 198 void map::Build (int couleur, int formation) {
IceTeam 60:8d2320a54a32 199 if (couleur == VERT) {
IceTeam 60:8d2320a54a32 200 max_x_table = 1400;
IceTeam 60:8d2320a54a32 201 max_y_table = 1800;
IceTeam 60:8d2320a54a32 202 min_x_table = 0;
IceTeam 60:8d2320a54a32 203 min_y_table = 0;
IceTeam 60:8d2320a54a32 204 }
IceTeam 60:8d2320a54a32 205 else {
IceTeam 60:8d2320a54a32 206 max_x_table = 2900;
IceTeam 60:8d2320a54a32 207 max_y_table = 1800;
IceTeam 60:8d2320a54a32 208 min_x_table = 1600;
IceTeam 60:8d2320a54a32 209 min_y_table = 0;
IceTeam 60:8d2320a54a32 210 }
IceTeam 60:8d2320a54a32 211
IceTeam 60:8d2320a54a32 212 if (couleur == VERT)
IceTeam 60:8d2320a54a32 213 addObs(obsCarr (0, 2000, 250, 150)); // Coté haut droite
IceTeam 60:8d2320a54a32 214 addObs(obsCarr (200, 2000, 200, 50));
IceTeam 60:8d2320a54a32 215 addObs(obsCarr (800, 100, 100, 15));
IceTeam 60:8d2320a54a32 216 }
IceTeam 60:8d2320a54a32 217 else {
IceTeam 60:8d2320a54a32 218 addObs(obsCarr (3000, 2000, 250, 150)); // Coté bas droite
IceTeam 60:8d2320a54a32 219 addObs(obsCarr (2800, 2000, 200, 50));
IceTeam 60:8d2320a54a32 220 addObs(obsCarr (2200, 100, 100, 15));
IceTeam 60:8d2320a54a32 221 }
IceTeam 60:8d2320a54a32 222
IceTeam 60:8d2320a54a32 223 addObs(obsCarr (1500, 750, 1100, 15));
IceTeam 60:8d2320a54a32 224 addObs(obsCarr (1500, 1050, 20, 300));
IceTeam 60:8d2320a54a32 225
IceTeam 60:8d2320a54a32 226 if (formation == 1) {
IceTeam 60:8d2320a54a32 227 Build_formation_1 (couleur);
IceTeam 60:8d2320a54a32 228 }
IceTeam 60:8d2320a54a32 229 else {
IceTeam 60:8d2320a54a32 230 addObs(obsCarr (1250, 1000, 220, 220));
IceTeam 60:8d2320a54a32 231 addObs(obsCarr (1500, 750, 220, 220));
IceTeam 60:8d2320a54a32 232 addObs(obsCarr (1500, 1250, 220, 220));
IceTeam 60:8d2320a54a32 233 }
IceTeam 60:8d2320a54a32 234 }
IceTeam 60:8d2320a54a32 235
IceTeam 60:8d2320a54a32 236 void map::Build_formation_1 (int couleur) {
IceTeam 60:8d2320a54a32 237 if (couleur == VERT) {
IceTeam 60:8d2320a54a32 238 addObs(obsCarr (200, 2000-450, 40, 40)); // Coquillages du haut droit
IceTeam 60:8d2320a54a32 239 addObs(obsCarr (200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 240
IceTeam 60:8d2320a54a32 241 addObs(obsCarr (900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 242 addObs(obsCarr (1200, 2000-350, 40, 40)); // Coquillages du milieu/haut
IceTeam 60:8d2320a54a32 243
IceTeam 60:8d2320a54a32 244 addObs(obsCarr (1500, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 245 addObs(obsCarr (1500, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 246
IceTeam 60:8d2320a54a32 247 //addObs(obsCarr (3000-900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 248 addObs(obsCarr (3000-1200, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 249
IceTeam 60:8d2320a54a32 250 //addObs(obsCarr (3000-200, 2000-450, 40, 40)); // Coquillages du bas droite
IceTeam 60:8d2320a54a32 251 //addObs(obsCarr (3000-200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 252 }
IceTeam 60:8d2320a54a32 253 else {
IceTeam 60:8d2320a54a32 254 //addObs(obsCarr (200, 2000-450, 40, 40)); // Coquillages du haut droit
IceTeam 60:8d2320a54a32 255 //addObs(obsCarr (200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 256
IceTeam 60:8d2320a54a32 257 //addObs(obsCarr (900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 258 addObs(obsCarr (1200, 2000-350, 40, 40)); // Coquillages du milieu/haut
IceTeam 60:8d2320a54a32 259
IceTeam 60:8d2320a54a32 260 addObs(obsCarr (1500, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 261 addObs(obsCarr (1500, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 262
IceTeam 60:8d2320a54a32 263 addObs(obsCarr (3000-900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 264 addObs(obsCarr (3000-1200, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 265
IceTeam 60:8d2320a54a32 266 addObs(obsCarr (3000-200, 2000-450, 40, 40)); // Coquillages du bas droite
IceTeam 60:8d2320a54a32 267 addObs(obsCarr (3000-200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 268 }
IceTeam 60:8d2320a54a32 269 }
IceTeam 60:8d2320a54a32 270
IceTeam 60:8d2320a54a32 271 void map::Build_formation_2 (int couleur) {
IceTeam 60:8d2320a54a32 272 if (couleur == VERT) {
IceTeam 60:8d2320a54a32 273 addObs(obsCarr (200, 2000-450, 40, 40)); // Coquillages du haut droit
IceTeam 60:8d2320a54a32 274 addObs(obsCarr (200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 275
IceTeam 60:8d2320a54a32 276 addObs(obsCarr (600, 2000-450, 40, 40)); // Coquillages du milieu haut
IceTeam 60:8d2320a54a32 277 addObs(obsCarr (600, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 278
IceTeam 60:8d2320a54a32 279 addObs(obsCarr (900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 280 addObs(obsCarr (1200, 2000-350, 40, 40)); // Coquillages du milieu/haut
IceTeam 60:8d2320a54a32 281
IceTeam 60:8d2320a54a32 282 addObs(obsCarr (1500, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 283 addObs(obsCarr (1500, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 284
IceTeam 60:8d2320a54a32 285 //addObs(obsCarr (3000-900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 286 addObs(obsCarr (3000-1200, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 287
IceTeam 60:8d2320a54a32 288 //addObs(obsCarr (3000-200, 2000-450, 40, 40)); // Coquillages du bas droite
IceTeam 60:8d2320a54a32 289 //addObs(obsCarr (3000-200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 290 }
IceTeam 60:8d2320a54a32 291 else {
IceTeam 60:8d2320a54a32 292 //addObs(obsCarr (200, 2000-450, 40, 40)); // Coquillages du haut droit
IceTeam 60:8d2320a54a32 293 //addObs(obsCarr (200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 294
IceTeam 60:8d2320a54a32 295 //addObs(obsCarr (900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 296 addObs(obsCarr (1200, 2000-350, 40, 40)); // Coquillages du milieu/haut
IceTeam 60:8d2320a54a32 297
IceTeam 60:8d2320a54a32 298 addObs(obsCarr (1500, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 299 addObs(obsCarr (1500, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 300
IceTeam 60:8d2320a54a32 301 addObs(obsCarr (3000-900, 2000-550, 40, 40));
IceTeam 60:8d2320a54a32 302 addObs(obsCarr (3000-1200, 2000-350, 40, 40));
IceTeam 60:8d2320a54a32 303
IceTeam 60:8d2320a54a32 304 addObs(obsCarr (3000-200, 2000-450, 40, 40)); // Coquillages du bas droite
IceTeam 60:8d2320a54a32 305 addObs(obsCarr (3000-200, 2000-750, 40, 40));
IceTeam 60:8d2320a54a32 306 }
IceTeam 47:be4eebf40568 307 }