Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Modules/PlayersLocator/VAPoints.cpp

Go to the documentation of this file.
00001 /**
00002  *  @file VAPoints.cpp
00003  *
00004  *  Represents a set of points on the field.
00005  *
00006  *  @author <A href=mailto:mkunz@sim.tu-darmstadt.de.de>Michael Kunz</A>
00007  */ 
00008 
00009 
00010 #include "VAPoints.h"
00011 
00012 #include "Tools/Debugging/Debugging.h"
00013 
00014 /*const double GAUSS0 = 1.0, GAUSS1 = .85, GAUSS2 = .51, GAUSS3 = .22, GAUSS4 = .72,
00015              GAUSS5 = .43, GAUSS6 = .19, GAUSS7 = .26, GAUSS8 = .11;*/
00016 
00017 const double GAUSS0 = 1.0, GAUSS1 = .63, GAUSS2 = .16, GAUSS4 = .40, GAUSS5 = .10;
00018 
00019 
00020 VAPoints::VAPoints(int numberOfVAPoints, int numberOfMaxima)
00021 {
00022   this->numberOfVAPoints = numberOfVAPoints;
00023   this->numberOfMaxima = numberOfMaxima;
00024 
00025   points = new VAPoint[numberOfVAPoints];
00026   maxima = new Maximum[numberOfMaxima];
00027   
00028   for(int i = 0; i < numberOfVAPoints; i++)
00029   {
00030     points[i].relevance = 0;
00031   }
00032   
00033   int gridX = 0, gridY = 0;
00034   
00035   for (gridX = 0; gridX < NUMBER_OF_GRID_POINTS_X; gridX++)
00036   {
00037     for (gridY = 0; gridY < NUMBER_OF_GRID_POINTS_Y; gridY++)
00038     {
00039       field[gridX][gridY] = 0;    
00040     }
00041   }
00042   
00043   timeOfLastMaximaSearch = SystemCall::getCurrentSystemTime();
00044 }
00045 
00046 VAPoints::~VAPoints()
00047 {
00048   delete points;
00049   delete maxima;
00050 }
00051 
00052 void VAPoints::addPoint(int x, int y, double validity, unsigned long timestamp)
00053 {
00054   double relevance;
00055   double age = SystemCall::getTimeSince(timestamp);
00056   if (age < validity * FADE_OUT_TIME2)
00057   {
00058     relevance = validity - (age / FADE_OUT_TIME2);
00059   }
00060   else
00061   {
00062     relevance = 0;
00063   }
00064 
00065   updateGridByPoint(x, y, relevance);
00066   
00067   /*  int insertPos = findInsertPos();
00068   points[insertPos].x = x;
00069   points[insertPos].y = y;
00070   points[insertPos].validity = validity;
00071   points[insertPos].timestamp = timestamp;
00072   points[insertPos].updateRelevance();*/
00073 }
00074 
00075 int VAPoints::findInsertPos()
00076 {
00077   double minRelevance = 10;
00078   int insertPos = 0;
00079   double currRelevance;
00080   for(int i = 0; i < numberOfVAPoints; i++)
00081   {
00082     currRelevance = points[i].getRelevance();
00083     if (currRelevance < minRelevance)
00084     {
00085       minRelevance = currRelevance;
00086       insertPos = i;
00087       if (minRelevance == 0) break;
00088     }
00089   }
00090   return insertPos;
00091 }
00092 
00093 void VAPoints::searchMaxima()
00094 {
00095   int gridX = 0, gridY = 0, maximum1 = 0, maximum2 = 0, temp = 0;
00096   bool isNear = false;
00097 
00098   for (int i=0; i < this->numberOfMaxima; i++)
00099   {
00100     maxima[i].x = -10;
00101     maxima[i].y = -10;
00102     maxima[i].height = 0;
00103   }
00104   
00105   double timeSinceLastSearch = SystemCall::getTimeSince(timeOfLastMaximaSearch);
00106   timeOfLastMaximaSearch = SystemCall::getCurrentSystemTime();
00107 
00108   double decrement = MIN_HEIGHT_FOR_MAX_VALIDITY * (timeSinceLastSearch / FADE_OUT_TIME2);
00109 
00110   for (gridX = 0; gridX < NUMBER_OF_GRID_POINTS_X; gridX++)
00111   {
00112     for (gridY = 0; gridY < NUMBER_OF_GRID_POINTS_Y; gridY++)
00113     {
00114       if (field[gridX][gridY] > MIN_HEIGHT_FOR_MAX_VALIDITY)
00115       {
00116         field[gridX][gridY] -= 2 * decrement;
00117       }
00118       else
00119       {
00120         if (field[gridX][gridY] > decrement)
00121         {
00122           field[gridX][gridY] -= decrement;
00123         }
00124         else
00125         {
00126           field[gridX][gridY] = 0;
00127         }
00128       }
00129     }
00130   }
00131 
00132   
00133   //pointsToField();
00134   
00135   for (gridX = 0; gridX < NUMBER_OF_GRID_POINTS_X; gridX++)
00136   {
00137     for (gridY = 0; gridY < NUMBER_OF_GRID_POINTS_Y; gridY++)
00138     {
00139       for (maximum1 = 0; maximum1 < this->numberOfMaxima; maximum1++)
00140       {
00141         if (field[gridX][gridY] > maxima[maximum1].height) if (isLokMax(gridX, gridY))
00142         {
00143           isNear = false;
00144           for (maximum2 = 0; maximum2 < this->numberOfMaxima; maximum2++)
00145           {
00146             if ((abs(gridX - maxima[maximum2].x) <= 2) && (abs(gridY - maxima[maximum2].y) <= 2))
00147             {
00148               isNear = true;
00149               if (field[gridX][gridY] > maxima[maximum2].height)
00150               {
00151                 for (temp = maximum2; temp > maximum1; temp--)
00152                 {
00153                   maxima[temp] = maxima[temp - 1];
00154                 }
00155                 maxima[maximum1].x = gridX;
00156                 maxima[maximum1].y = gridY;
00157                 maxima[maximum1].height = field[gridX][gridY];
00158               }
00159               break;
00160             }
00161           }
00162           
00163           if (isNear) break;
00164 
00165           for (temp = this->numberOfMaxima - 1; temp > maximum1; temp--)
00166           {
00167             maxima[temp] = maxima[temp - 1];
00168           }
00169           maxima[maximum1].x = gridX;
00170           maxima[maximum1].y = gridY;
00171           maxima[maximum1].height = field[gridX][gridY];
00172           break;
00173         }
00174       }
00175     }
00176   }  
00177 }
00178 
00179 bool VAPoints::getMaximum(int index, int& x_position, int& y_position, double& validity)
00180 {
00181   if((index < 0) || (index > this->numberOfMaxima) || (maxima[index].height == 0)) return false;
00182   
00183   int fieldX = 0, fieldY = 0;
00184   getFieldPoints(maxima[index].x, maxima[index].y, fieldX, fieldY);
00185   
00186   x_position = fieldX;
00187   y_position = fieldY;
00188 
00189   if (maxima[index].height > MIN_HEIGHT_FOR_MAX_VALIDITY)
00190     validity = 1.0;
00191   else
00192     validity = maxima[index].height / MIN_HEIGHT_FOR_MAX_VALIDITY;
00193 
00194 /*  if (index == 0)
00195   {
00196     OUTPUT(idText,text, "Gipfelhöhe:" << maxima[index].height << "validity: " << validity);
00197   }*/
00198 
00199   return true;
00200 }
00201 
00202 void VAPoints::pointsToField()
00203 {
00204 
00205   int gridX = 0, gridY = 0;
00206 
00207   for (gridX = 0; gridX < NUMBER_OF_GRID_POINTS_X; gridX++)
00208   {
00209     for (gridY = 0; gridY < NUMBER_OF_GRID_POINTS_Y; gridY++)
00210     {
00211       field[gridX][gridY] = 0;    
00212     }
00213   }
00214   
00215   for (int i = 0; i < numberOfVAPoints; i++)
00216   {
00217     updateGridByPoint(points[i].x, points[i].y,points[i].getRelevance());
00218   }
00219 }
00220 
00221 void VAPoints::updateGridByPoint(int xPos, int yPos, double relevance)
00222 {
00223   int gridX = 0, gridY = 0;
00224   
00225   if (relevance > 0)
00226   {
00227     getGridIndices(xPos, yPos, gridX, gridY);
00228     
00229     /*incrementGridPoint(gridX-2, gridY-3, GAUSS8 * relevance);
00230     incrementGridPoint(gridX-1, gridY-3, GAUSS6 * relevance);
00231     incrementGridPoint(gridX, gridY-3, GAUSS3 * relevance);
00232     incrementGridPoint(gridX+1, gridY-3, GAUSS6 * relevance);
00233     incrementGridPoint(gridX+2, gridY-3, GAUSS8 * relevance);
00234     
00235     incrementGridPoint(gridX-3, gridY-2, GAUSS8 * relevance);
00236     incrementGridPoint(gridX-2, gridY-2, GAUSS7 * relevance);
00237     incrementGridPoint(gridX-1, gridY-2, GAUSS5 * relevance);
00238     incrementGridPoint(gridX, gridY-2, GAUSS2 * relevance);
00239     incrementGridPoint(gridX+1, gridY-2, GAUSS5 * relevance);
00240     incrementGridPoint(gridX+2, gridY-2, GAUSS7 * relevance);
00241     incrementGridPoint(gridX+3, gridY-2, GAUSS8 * relevance);
00242     
00243     incrementGridPoint(gridX-3, gridY-1, GAUSS6 * relevance);
00244     incrementGridPoint(gridX-2, gridY-1, GAUSS5 * relevance);
00245     incrementGridPoint(gridX-1, gridY-1, GAUSS4 * relevance);
00246     incrementGridPoint(gridX, gridY-1, GAUSS1 * relevance);
00247     incrementGridPoint(gridX+1, gridY-1, GAUSS4 * relevance);
00248     incrementGridPoint(gridX+2, gridY-1, GAUSS5 * relevance);
00249     incrementGridPoint(gridX+3, gridY-1, GAUSS6 * relevance);
00250     
00251     incrementGridPoint(gridX-3, gridY, GAUSS3 * relevance);
00252     incrementGridPoint(gridX-2, gridY, GAUSS2 * relevance);
00253     incrementGridPoint(gridX-1, gridY, GAUSS1 * relevance);
00254     incrementGridPoint(gridX, gridY, GAUSS0 * relevance);
00255     incrementGridPoint(gridX+1, gridY, GAUSS1 * relevance);
00256     incrementGridPoint(gridX+2, gridY, GAUSS2 * relevance);
00257     incrementGridPoint(gridX+3, gridY, GAUSS3 * relevance);
00258     
00259     incrementGridPoint(gridX-3, gridY+1, GAUSS6 * relevance);
00260     incrementGridPoint(gridX-2, gridY+1, GAUSS5 * relevance);
00261     incrementGridPoint(gridX-1, gridY+1, GAUSS4 * relevance);
00262     incrementGridPoint(gridX, gridY+1, GAUSS1 * relevance);
00263     incrementGridPoint(gridX+1, gridY+1, GAUSS4 * relevance);
00264     incrementGridPoint(gridX+2, gridY+1, GAUSS5 * relevance);
00265     incrementGridPoint(gridX+3, gridY+1, GAUSS6 * relevance);
00266     
00267     incrementGridPoint(gridX-3, gridY+2, GAUSS8 * relevance);
00268     incrementGridPoint(gridX-2, gridY+2, GAUSS7 * relevance);
00269     incrementGridPoint(gridX-1, gridY+2, GAUSS5 * relevance);
00270     incrementGridPoint(gridX, gridY+2, GAUSS2 * relevance);
00271     incrementGridPoint(gridX+1, gridY+2, GAUSS5 * relevance);
00272     incrementGridPoint(gridX+2, gridY+2, GAUSS7 * relevance);
00273     incrementGridPoint(gridX+3, gridY+2, GAUSS8 * relevance);
00274     
00275     incrementGridPoint(gridX-2, gridY+3, GAUSS8 * relevance);
00276     incrementGridPoint(gridX-1, gridY+3, GAUSS6 * relevance);
00277     incrementGridPoint(gridX, gridY+3, GAUSS3 * relevance);
00278     incrementGridPoint(gridX+1, gridY+3, GAUSS6 * relevance);
00279     incrementGridPoint(gridX+2, gridY+3, GAUSS8 * relevance);*/   
00280     
00281     
00282     incrementGridPoint(gridX-1, gridY-2, GAUSS5 * relevance);
00283     incrementGridPoint(gridX, gridY-2, GAUSS2 * relevance);
00284     incrementGridPoint(gridX+1, gridY-2, GAUSS5 * relevance);
00285     
00286     incrementGridPoint(gridX-2, gridY-1, GAUSS5 * relevance);
00287     incrementGridPoint(gridX-1, gridY-1, GAUSS4 * relevance);
00288     incrementGridPoint(gridX, gridY-1, GAUSS1 * relevance);
00289     incrementGridPoint(gridX+1, gridY-1, GAUSS4 * relevance);
00290     incrementGridPoint(gridX+2, gridY-1, GAUSS5 * relevance);
00291     
00292     incrementGridPoint(gridX-2, gridY, GAUSS2 * relevance);
00293     incrementGridPoint(gridX-1, gridY, GAUSS1 * relevance);
00294     incrementGridPoint(gridX, gridY, GAUSS0 * relevance);
00295     incrementGridPoint(gridX+1, gridY, GAUSS1 * relevance);
00296     incrementGridPoint(gridX+2, gridY, GAUSS2 * relevance);
00297     
00298     incrementGridPoint(gridX-2, gridY+1, GAUSS5 * relevance);
00299     incrementGridPoint(gridX-1, gridY+1, GAUSS4 * relevance);
00300     incrementGridPoint(gridX, gridY+1, GAUSS1 * relevance);
00301     incrementGridPoint(gridX+1, gridY+1, GAUSS4 * relevance);
00302     incrementGridPoint(gridX+2, gridY+1, GAUSS5 * relevance);
00303     
00304     incrementGridPoint(gridX-1, gridY+2, GAUSS5 * relevance);
00305     incrementGridPoint(gridX, gridY+2, GAUSS2 * relevance);
00306     incrementGridPoint(gridX+1, gridY+2, GAUSS5 * relevance);
00307   }
00308 }
00309 
00310 void VAPoints::incrementGridPoint(int xIndex, int yIndex, double increment)
00311 {
00312   if ((xIndex >= 1) && (xIndex <= NUMBER_OF_GRID_POINTS_X - 1) && (yIndex >= 1) && (yIndex <= NUMBER_OF_GRID_POINTS_Y - 1))
00313   {
00314     double fieldHeight = field[xIndex][yIndex];
00315     double realHeight = (MIN_HEIGHT_FOR_MAX_VALIDITY * fieldHeight) / ((2 * MIN_HEIGHT_FOR_MAX_VALIDITY) - fieldHeight);
00316 
00317     field[xIndex][yIndex] = (2 * MIN_HEIGHT_FOR_MAX_VALIDITY) - ((2 * MIN_HEIGHT_FOR_MAX_VALIDITY * MIN_HEIGHT_FOR_MAX_VALIDITY) / (realHeight + increment +  MIN_HEIGHT_FOR_MAX_VALIDITY));
00318     //field[xIndex][yIndex] += increment;
00319   }
00320 }
00321 
00322 void VAPoints::getGridIndices(int xPos, int yPos, int& xIndex, int& yIndex)
00323 {
00324   xIndex = (int)((xPos - xPosBackFlags) / GRID_SPACING);
00325   
00326   if(xIndex < 1)
00327     xIndex = 1;
00328   if(xIndex >= NUMBER_OF_GRID_POINTS_X - 1)
00329     xIndex = NUMBER_OF_GRID_POINTS_X - 1;
00330   
00331   yIndex = (int)((yPos - yPosRightFlags) / GRID_SPACING);
00332   
00333   if(yIndex < 1)
00334     yIndex = 1;
00335   if(yIndex >= NUMBER_OF_GRID_POINTS_Y - 1)
00336     yIndex = NUMBER_OF_GRID_POINTS_Y - 1;  
00337 }
00338 
00339 void VAPoints::getFieldPoints(int xIndex, int yIndex, int& xPos, int& yPos)
00340 {
00341   xPos = xIndex * GRID_SPACING + xPosBackFlags;
00342   yPos = yIndex * GRID_SPACING + yPosRightFlags;
00343 }
00344 
00345 bool VAPoints::isLokMax(int xIndex, int yIndex)
00346 {
00347   bool result = true;
00348 
00349   for (int gridX = xIndex-1; gridX <= xIndex+1; gridX++)
00350   {
00351     for (int gridY = yIndex-1; gridY <= yIndex+1; gridY++)
00352     {
00353       if ((gridX == xIndex) && (gridY == yIndex)) break;
00354       if ((xIndex >= 2) && (xIndex <= NUMBER_OF_GRID_POINTS_X - 2) && (yIndex >= 2) && (yIndex <= NUMBER_OF_GRID_POINTS_Y - 2))
00355         result &= (field[xIndex][yIndex] > field[gridX][gridY]);
00356     }
00357   }
00358   return result;
00359 }
00360 
00361 
00362 // Streaming operators
00363 In& operator>>(In& stream,VAPoints& VAPoints)
00364 {
00365   stream >> VAPoints.numberOfVAPoints;
00366   stream.read(&VAPoints.points,sizeof(VAPoints.points));
00367   return stream;
00368 }
00369 
00370 Out& operator<<(Out& stream, const VAPoints& vaPoints)
00371 {
00372   stream << vaPoints.numberOfVAPoints;
00373   stream.write(&vaPoints.points, sizeof(vaPoints.points));
00374   return stream;
00375 }
00376 
00377 
00378 /*
00379  *
00380  * $Log: VAPoints.cpp,v $
00381  * Revision 1.1.1.1  2004/05/22 17:20:40  cvsadm
00382  * created new repository GT2004_WM
00383  *
00384  * Revision 1.1  2003/10/06 14:10:15  cvsadm
00385  * Created GT2004 (M.J.)
00386  *
00387  * Revision 1.1  2003/09/26 11:38:52  juengel
00388  * - sorted tools
00389  * - clean-up in DataTypes
00390  *
00391  * Revision 1.1.1.1  2003/07/02 09:40:22  cvsadm
00392  * created new repository for the competitions in Padova from the 
00393  * tamara CVS (Tuesday 2:00 pm)
00394  *
00395  * removed unused solutions
00396  *
00397  * Revision 1.10  2003/05/27 09:05:50  mkunz
00398  * more flexible number of maxima
00399  * restricted height in field
00400  * some performance hacks
00401  *
00402  * Revision 1.9  2003/05/20 12:39:08  mkunz
00403  * debug messages removed
00404  *
00405  * Revision 1.8  2003/05/16 14:49:26  mkunz
00406  * enlarged gridsize
00407  *
00408  * Revision 1.7  2003/05/14 13:21:09  mkunz
00409  * flexible array size
00410  *
00411  * Revision 1.6  2003/05/12 10:29:37  dueffert
00412  * == bug fixed
00413  *
00414  * Revision 1.5  2003/05/09 09:54:27  mkunz
00415  * some finetuning
00416  *
00417  * Revision 1.4  2003/05/08 19:49:00  mkunz
00418  * first runnig version
00419  *
00420  * Revision 1.3  2003/05/08 18:19:39  mkunz
00421  * little dirty workaround-bugfix
00422  *
00423  * Revision 1.2  2003/05/08 18:05:35  mkunz
00424  * methods completed
00425  *
00426  * Revision 1.1  2003/05/08 16:49:39  mkunz
00427  * class VAPoints added.
00428  * similar to PointsWithValidityAndAge but with validity and age
00429  *
00430  */

Generated on Thu Sep 23 19:57:31 2004 for GT2004 by doxygen 1.3.6