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

Tools/FieldDimensions.h

Go to the documentation of this file.
00001 /**
00002 * @file FieldDimensions.h
00003 *
00004 * Description of the dimensions of the field.
00005 *
00006 * @author Matthias Jüngel
00007 * @author Thomas Röfer
00008 */
00009 
00010 #ifndef __FieldDimensions_h_ 
00011 #define __FieldDimensions_h_ 
00012 #include "Math/Geometry.h"
00013 #include "Math/Common.h"
00014 
00015 
00016 //#define LARGE_FIELD
00017 //#define GLASSBOX
00018 #define HUGE_FIELD
00019 
00020 #ifdef HUGE_FIELD
00021 
00022 static const int xPosOpponentFieldBorder    =  3000;
00023 static const int xPosOpponentGoal           =  3000;
00024 static const int xPosFrontFlags             =  1350;
00025 static const int xPosOpponentGoalpost       =  2700;
00026 static const int xPosOpponentGroundline     =  2700;
00027 static const int xPosOpponentSideCorner     =  2700;
00028 static const int xPosOpponentPenaltyArea    =  2050;
00029 static const int xPosHalfWayLine            =     0;
00030 
00031 static const int xPosOwnPenaltyArea         = -xPosOpponentPenaltyArea;
00032 static const int xPosOwnSideCorner          = -xPosOpponentSideCorner;
00033 static const int xPosOwnGroundline          = -xPosOpponentGroundline;
00034 static const int xPosOwnGoalpost            = -xPosOpponentGoalpost;
00035 static const int xPosBackFlags              = -xPosFrontFlags;
00036 static const int xPosOwnGoal                = -xPosOpponentGoal;
00037 static const int xPosOwnFieldBorder         = -xPosOpponentFieldBorder;
00038 
00039 static const int yPosLeftFieldBorder        =  2000;
00040 static const int yPosLeftFlags              =  1950;
00041 static const int yPosLeftSideline           =  1800;
00042 static const int yPosLeftGroundline         =  1800;
00043 static const int yPosLeftPenaltyArea        =   650;
00044 static const int yPosLeftGoal               =   400;
00045 static const int yPosCenterGoal             =     0;
00046 static const int yPosRightGoal              = -yPosLeftGoal;
00047 static const int yPosRightPenaltyArea       = -yPosLeftPenaltyArea;
00048 static const int yPosRightGroundline        = -yPosLeftGroundline;
00049 static const int yPosRightSideline          = -yPosLeftSideline;
00050 static const int yPosRightFlags             = -yPosLeftFlags;
00051 static const int yPosRightFieldBorder       = -yPosLeftFieldBorder;
00052 
00053 //absolute coordinates (for ceiling camera)
00054 static const int xPosYellowGroundline       =  xPosOpponentGroundline;
00055 static const int xPosYellowSideCorner       =  xPosOpponentSideCorner;
00056 static const int xPosYellowPenaltyArea      =  xPosOpponentPenaltyArea;
00057 static const int xPosBluePenaltyArea        =  xPosOwnPenaltyArea;
00058 static const int xPosBlueSideCorner         =  xPosOwnSideCorner;
00059 static const int xPosBlueGroundline         =  xPosOwnGroundline;
00060 
00061 //other dimensions
00062 static const int centerCircleRadius         = 180;
00063 static const double flagRadius              = 51.5;
00064 static const int flagHeight                 = 200;
00065 static const int flagColorHeight            = 100;
00066 static const int goalHeight                 = 300;
00067 static const int goalWidth                  = 2*yPosLeftGoal;
00068 static const int goalDepth                  = xPosOpponentGoal - xPosOpponentGroundline;
00069 static const double ballRadius              = 43;
00070 static const int fieldLinesWidth            = 25;
00071 
00072 //throw-in points
00073 static const int xPosThrowInPointOpponentHalf = 1700;
00074 static const int xPosThrowInPointCenter       = 0;
00075 static const int xPosThrowInPointOwnHalf      = -xPosThrowInPointOpponentHalf;
00076 static const int yPosThrowInPointLeft         = yPosLeftSideline - 400;
00077 static const int yPosThrowInPointRight        = -yPosThrowInPointLeft;
00078 
00079 #else
00080 #ifdef LARGE_FIELD
00081 
00082 static const int xPosOpponentFieldBorder    =  2500;
00083 static const int xPosOpponentGoal           =  2450;
00084 static const int xPosFrontFlags             =  2200;
00085 static const int xPosOpponentGoalpost       =  2200;
00086 static const int xPosOpponentGroundline     =  2100;
00087 static const int xPosOpponentSideCorner     =  1800;
00088 static const int xPosOpponentPenaltyArea    =  1600;
00089 static const int xPosHalfWayLine            =     0;
00090 
00091 static const int xPosOwnPenaltyArea         = -1600;
00092 static const int xPosOwnSideCorner          = -1800;
00093 static const int xPosOwnGroundline          = -2100;
00094 static const int xPosOwnGoalpost            = -2200;
00095 static const int xPosBackFlags              = -2200;
00096 static const int xPosOwnGoal                = -2450;
00097 static const int xPosOwnFieldBorder         = -xPosOpponentFieldBorder;
00098 
00099 static const int yPosLeftFieldBorder        =  1500;
00100 static const int yPosLeftFlags              =  1450;
00101 static const int yPosLeftSideline           =  1350;
00102 static const int yPosLeftGroundline         =  1050;
00103 static const int yPosLeftPenaltyArea        =   500;
00104 static const int yPosLeftGoal               =   300;
00105 static const int yPosCenterGoal             =     0;
00106 static const int yPosRightGoal              =  -300;
00107 static const int yPosRightPenaltyArea       =  -500;
00108 static const int yPosRightGroundline        = -1050;
00109 static const int yPosRightSideline          = -1350;
00110 static const int yPosRightFlags             = -1450;
00111 static const int yPosLeftFieldBorder        = -yPosLeftFieldBorder;
00112 
00113 //absolute coordinates (for ceiling camera)
00114 static const int xPosYellowGroundline       =  2100;
00115 static const int xPosYellowSideCorner       =  1800;
00116 static const int xPosYellowPenaltyArea      =  1600;
00117 static const int xPosBluePenaltyArea        = -1600;
00118 static const int xPosBlueSideCorner         = -1800;
00119 static const int xPosBlueGroundline         = -2100;
00120 
00121 //other dimensions
00122 static const int centerCircleRadius         = 180;
00123 static const double flagRadius              = 51.5;
00124 static const int flagHeight                 = 200;
00125 static const int flagColorHeight            = 100;
00126 static const int goalHeight                 = 300;
00127 static const double ballRadius              = 43;
00128 static const int fieldLinesWidth            = 25;
00129 static const int wallHeight                 = 100;
00130 
00131 //throw-in points (not used on this field!)
00132 static const int xPosThrowInPointOpponentHalf = 0;
00133 static const int xPosThrowInPointCenter       = 0;
00134 static const int xPosThrowInPointOwnHalf      = 0;
00135 static const int yPosThrowInPointLeft         = 0;
00136 static const int yPosThrowInPointRight        = 0;
00137 
00138 #else
00139 
00140 
00141 // Field-dimensions for 60cm x 60cm glass-presentation-box. 
00142 // This box has only 4 landmarks and a green floor.
00143 
00144 #ifdef GLASSBOX
00145 
00146 static const int xPosOpponentGoal           =  301;
00147 static const int xPosFrontFlags             =  265;
00148 static const int xPosOpponentGoalpost       =  241;
00149 static const int xPosOpponentGroundline     =  240;
00150 static const int xPosOpponentSideCorner     =  240;
00151 static const int xPosOpponentPenaltyArea    =  200;
00152 static const int xPosHalfWayLine            =    0;
00153 
00154 static const int xPosOwnPenaltyArea         =  -200;
00155 static const int xPosOwnSideCorner          =  -240;
00156 static const int xPosOwnGroundline          =  -240;
00157 static const int xPosOwnGoalpost            =  -241;
00158 static const int xPosBackFlags              =  -265;
00159 static const int xPosOwnGoal                =  -301;
00160 
00161 static const int yPosLeftFlags              =   265;
00162 static const int yPosLeftSideline           =   240;
00163 static const int yPosLeftPenaltyArea        =   150;
00164 static const int yPosLeftGroundline         =   150;
00165 static const int yPosLeftGoal               =   150;
00166 static const int yPosCenterGoal             =     0;
00167 static const int yPosRightGoal              =  -150;
00168 static const int yPosCenterRightHalf        =  -150;
00169 static const int yPosRightGroundline        =  -150;
00170 static const int yPosRightPenaltyArea       =  -150;
00171 static const int yPosRightSideline          =  -240;
00172 static const int yPosRightFlags             =  -265;
00173 
00174 //absolute coordinates (for ceiling camera)
00175 static const int xPosYellowGroundline       =  1400;
00176 static const int xPosYellowSideCorner       =  1100;
00177 static const int xPosYellowPenaltyLine      =   950;
00178 static const int xPosBluePenaltyLine        =  -950;
00179 static const int xPosBlueSideCorner         = -1100;
00180 static const int xPosBlueGroundline         = -1400;
00181 
00182 //other dimensions
00183 static const int centerCircleRadius         = 1;
00184 static const double flagRadius              = 27;
00185 static const int flagHeight                 = 100;
00186 static const int goalHeight                 = 100;
00187 static const double ballRadius              = 43;
00188 static const int fieldLinesWidth            = 25; //?? check this!
00189 static const int flagColorHeight            = 50;
00190 static const int wallHeight                 = 100;
00191 
00192 //throw-in points (not used on this field!)
00193 static const int xPosThrowInPointOpponentHalf = 0;
00194 static const int xPosThrowInPointCenter       = 0;
00195 static const int xPosThrowInPointOwnHalf      = 0;
00196 static const int yPosThrowInPointLeft         = 0;
00197 static const int yPosThrowInPointRight        = 0;
00198 
00199 #else
00200 
00201 static const int xPosOpponentGoal           =  1750;
00202 static const int xPosFrontFlags             =  1531;
00203 static const int xPosOpponentGoalpost       =  1470;
00204 static const int xPosOpponentGroundline     =  1420;
00205 static const int xPosOpponentSideCorner     =  1100;
00206 static const int xPosOpponentPenaltyArea    =  1060;
00207 static const int xPosHalfWayLine            =     0;
00208 
00209 static const int xPosOwnPenaltyArea         = -1060;
00210 static const int xPosOwnSideCorner          = -1100;
00211 static const int xPosOwnGroundline          = -1420;
00212 static const int xPosOwnGoalpost            = -1470;
00213 static const int xPosBackFlags              = -1531;
00214 static const int xPosOwnGoal                = -1750;
00215 
00216 static const int yPosLeftFlags              =  1031;
00217 static const int yPosLeftSideline           =   900;
00218 static const int yPosLeftPenaltyArea        =   900;
00219 static const int yPosLeftGroundline         =   600;
00220 static const int yPosLeftGoal               =   300;
00221 static const int yPosCenterGoal             =     0;
00222 static const int yPosRightGoal              =  -300;
00223 static const int yPosCenterRightHalf        =  -500;
00224 static const int yPosRightGroundline        =  -600;
00225 static const int yPosRightPenaltyArea       =  -900;
00226 static const int yPosRightSideline          =  -900;
00227 static const int yPosRightFlags             = -1031;
00228 
00229 //absolute coordinates (for ceiling camera)
00230 static const int xPosYellowGroundline       =  1400;
00231 static const int xPosYellowSideCorner       =  1100;
00232 static const int xPosYellowPenaltyLine      =   950;
00233 static const int xPosBluePenaltyLine        =  -950;
00234 static const int xPosBlueSideCorner         = -1100;
00235 static const int xPosBlueGroundline         = -1400;
00236 
00237 //other dimensions
00238 static const int centerCircleRadius         = 150;
00239 static const double flagRadius              = 50;
00240 static const int flagHeight                 = 200;
00241 static const int goalHeight                 = 300;
00242 static const double ballRadius              = 43;
00243 static const int fieldLinesWidth            = 25; 
00244 static const int flagColorHeight            = 100;
00245 static const int wallHeight                 = 100;
00246 
00247 //throw-in points (not used on this field!)
00248 static const int xPosThrowInPointOpponentHalf = 0;
00249 static const int xPosThrowInPointCenter       = 0;
00250 static const int xPosThrowInPointOwnHalf      = 0;
00251 static const int yPosThrowInPointLeft         = 0;
00252 static const int yPosThrowInPointRight        = 0;
00253 
00254 #endif // GLASSBOX
00255 #endif // LARGE_FIELD
00256 #endif // HUGE_FIELD
00257 
00258 static const Vector2<int> 
00259   ownGroundlineLeft(xPosOwnGroundline,yPosLeftGroundline);
00260 static const Vector2<int> 
00261   ownGroundlineRight(xPosOwnGroundline,yPosRightGroundline);
00262 static const Vector2<int> 
00263   ownGoalRearPanelMiddle(xPosOwnGoal,yPosCenterGoal);
00264 static const Vector2<int> 
00265   opponentGoalRearPanelMiddle(xPosOpponentGoal,yPosCenterGoal);
00266 static const Vector2<int> 
00267   opponentGroundlineLeft(xPosOpponentGroundline,yPosLeftGroundline);
00268 static const Vector2<int> 
00269   opponentGroundlineRight(xPosOpponentGroundline,yPosRightGroundline);
00270 
00271 
00272 static const Vector2<int> 
00273   leftSideLineOwnEnd(xPosOwnSideCorner,yPosLeftSideline);
00274 static const Vector2<int> 
00275   leftSideLineOpponentEnd(xPosOpponentSideCorner,yPosLeftSideline);
00276 static const Vector2<int> 
00277   rightSideLineOwnEnd(xPosOwnSideCorner,yPosRightSideline);
00278 static const Vector2<int> 
00279   rightSideLineOpponentEnd(xPosOpponentSideCorner,yPosRightSideline);
00280 
00281 static const Vector2<int>
00282   ownGoalLeftPost(xPosOwnGroundline,yPosLeftGoal);
00283 static const Vector2<int>
00284   ownGoalRightPost(xPosOwnGroundline,yPosRightGoal);
00285 static const Vector2<int>
00286   opponentGoalLeftPost(xPosOpponentGroundline,yPosLeftGoal);
00287 static const Vector2<int>
00288   opponentGoalRightPost(xPosOpponentGroundline,yPosRightGoal);
00289 
00290 static const Vector2<int>
00291   ownGoalLeftRearPanel(xPosOwnGoal,yPosLeftGoal);
00292 static const Vector2<int>
00293   ownGoalRightRearPanel(xPosOwnGoal,yPosRightGoal);
00294 static const Vector2<int>
00295   opponentGoalLeftRearPanel(xPosOpponentGoal,yPosLeftGoal);
00296 static const Vector2<int>
00297   opponentGoalRightRearPanel(xPosOpponentGoal,yPosRightGoal);
00298  
00299 
00300 
00301 static const Geometry::Line leftWall
00302 (leftSideLineOwnEnd,
00303  leftSideLineOpponentEnd - leftSideLineOwnEnd);
00304 
00305 static const Geometry::Line opponentLeftCorner
00306 (leftSideLineOpponentEnd,
00307  opponentGroundlineLeft - leftSideLineOpponentEnd);
00308 
00309 static const Geometry::Line opponentLeftGroundline
00310 (opponentGroundlineLeft,
00311  opponentGoalLeftPost - opponentGroundlineLeft);
00312 
00313 static const Geometry::Line opponentGoalLeftWall
00314 (opponentGoalLeftPost,
00315  opponentGoalLeftRearPanel - opponentGoalLeftPost);
00316 
00317 static const Geometry::Line opponentGoalRearWall
00318 (opponentGoalLeftRearPanel,
00319  opponentGoalRightRearPanel - opponentGoalLeftRearPanel);
00320 
00321 static const Geometry::Line opponentGoalRightWall
00322 (opponentGoalRightRearPanel,
00323  opponentGoalRightPost - opponentGoalRightRearPanel);
00324 
00325 static const Geometry::Line opponentRightGroundline
00326 (opponentGoalRightPost,
00327  opponentGroundlineRight - opponentGoalRightPost);
00328 
00329 static const Geometry::Line opponentRightCorner
00330 (opponentGroundlineRight,
00331  rightSideLineOpponentEnd - opponentGroundlineRight);
00332 
00333 static const Geometry::Line rightWall
00334 (rightSideLineOpponentEnd,
00335  rightSideLineOwnEnd - rightSideLineOpponentEnd);
00336 
00337 static const Geometry::Line ownRightCorner
00338 (rightSideLineOwnEnd,
00339  ownGroundlineRight - rightSideLineOwnEnd);
00340 
00341 static const Geometry::Line ownRightGroundline
00342 (ownGroundlineRight,
00343  ownGoalRightPost - ownGroundlineRight);
00344 
00345 static const Geometry::Line ownGoalRightWall
00346 (ownGoalRightPost,
00347  ownGoalRightRearPanel - ownGoalRightPost);
00348 
00349 static const Geometry::Line ownGoalRearWall
00350 (ownGoalRightRearPanel,
00351  ownGoalLeftRearPanel - ownGoalRightRearPanel);
00352 
00353 static const Geometry::Line ownGoalLeftWall
00354 (ownGoalLeftRearPanel,
00355  ownGoalLeftPost - ownGoalLeftRearPanel);
00356 
00357 static const Geometry::Line ownLeftGroundline
00358 (ownGoalLeftPost,
00359  ownGroundlineLeft - ownGoalLeftPost);
00360 
00361 static const Geometry::Line ownLeftCorner
00362 (ownGroundlineLeft,
00363  leftSideLineOwnEnd - ownGroundlineLeft);
00364 
00365 static const int numOfLandmarks = 13;
00366 
00367 
00368 /** 
00369 * Points that can act as landmarks!
00370 * For the goal and the corner posts these points (in 3D) lie on the top-most
00371 * point of the landmarks. This is because when looking at them, headcontrol
00372 * looks 
00373 */ 
00374 static const class Landmark
00375 {
00376   public:
00377   enum LandmarkType /*< bear in mind that this is only true if the robot is playing red!! */
00378   {
00379     pinkAboveYellow, pinkAboveSkyblue, 
00380     yellowAbovePink, skyblueAbovePink,
00381     ownGoal, opponentGoal, fieldMarking, 
00382     numberOfLandmarkTypes
00383   }; /**< enum of the different types of landmarks used for localization */
00384 
00385     Landmark(int x, int y, int z, double sizeXY, double heightZ, int landmarkType):
00386       position((double)x, (double)y, (double)z), width(sizeXY), height(heightZ), kind(landmarkType)
00387     {;}
00388     Landmark(double x, double y, double z, double w, double h, int landmarkType): 
00389       position(x, y, z), width(w), height(h), kind(landmarkType)
00390     {;}
00391 
00392   Vector3<double> position;
00393   double width, height;
00394   int kind;
00395 }             
00396 targetPointOnLandmark[numOfLandmarks] =
00397 {
00398   Landmark(xPosFrontFlags, yPosLeftFlags,  flagHeight + (long )2.5*flagColorHeight, flagRadius, flagColorHeight, Landmark::skyblueAbovePink), // opponent left
00399   Landmark(xPosFrontFlags, yPosRightFlags, flagHeight + (long )2.5*flagColorHeight, flagRadius, flagColorHeight, Landmark::pinkAboveSkyblue), // opponent right
00400   Landmark(xPosBackFlags,  yPosLeftFlags,  flagHeight + (long )2.5*flagColorHeight, flagRadius, flagColorHeight, Landmark::yellowAbovePink), // own left
00401   Landmark(xPosBackFlags,  yPosRightFlags, flagHeight + (long )2.5*flagColorHeight, flagRadius, flagColorHeight, Landmark::pinkAboveYellow), // own right
00402   Landmark(xPosOwnPenaltyArea, yPosLeftPenaltyArea,  0, 20.0, 0.0, Landmark::fieldMarking),
00403   Landmark(xPosOwnPenaltyArea, yPosRightPenaltyArea, 0, 20.0, 0.0, Landmark::fieldMarking),
00404   Landmark(xPosOpponentPenaltyArea, yPosLeftPenaltyArea,  0, 20.0, 0.0, Landmark::fieldMarking),
00405   Landmark(xPosOpponentPenaltyArea, yPosRightPenaltyArea, 0, 20.0, 0.0, Landmark::fieldMarking),
00406   Landmark(xPosHalfWayLine, 0, 0, 20.0, 0.0, Landmark::fieldMarking),
00407   Landmark(xPosHalfWayLine, yPosLeftGroundline,  0, 20.0, 0.0, Landmark::fieldMarking),
00408   Landmark(xPosHalfWayLine, yPosRightGroundline, 0, 20.0, 0.0, Landmark::fieldMarking),
00409   Landmark(xPosOpponentGoalpost, 0, (long )(1.2*goalHeight), (long )(1.2*yPosLeftGoal), goalHeight, Landmark::opponentGoal),
00410   Landmark(xPosOwnGoalpost, 0,      (long )(1.2*goalHeight), (long )(1.2*yPosLeftGoal), goalHeight, Landmark::ownGoal)
00411 };
00412 
00413 /**
00414 * Static class containing some useful functions
00415 * regarding field dimensions.
00416 *
00417 * @author Max Risler
00418 */
00419 class FieldDimensions 
00420 {
00421 public:
00422   /**
00423   * Returns true when p is inside the field.
00424   */
00425   static bool isInsideField(const Vector2<int> &p);
00426 
00427   /**
00428   * Returns true when (x,y) is inside the field.
00429   */
00430   static bool isInsideField(int x, int y)
00431   {
00432     return isInsideField (Vector2<int>(x,y));
00433   }
00434 
00435   /**
00436   * Returns true when p is inside one of the goals.
00437   */
00438   static bool isInsideGoal(const Vector2<int> &p);
00439 
00440   /**
00441   * Returns true when (x,y) is inside one of the goals.
00442   */
00443   static bool isInsideGoal(int x, int y)
00444   {
00445     return isInsideGoal (Vector2<int>(x,y));
00446   }
00447 
00448   /**
00449   * Returns true when p is inside the own goal.
00450   */
00451   static bool isInsideOwnGoal(const Vector2<int> &p);
00452 
00453   /**
00454   * Returns true when p is inside the opponent goal.
00455   */
00456   static bool isInsideOpponentGoal(const Vector2<int> &p);
00457 
00458   /**
00459   * Returns true when p is on the groundline of the own goal.
00460   */
00461   static bool isOnOwnGoalGroundline(const Vector2<int> &p);
00462 
00463   /**
00464   * Returns true when p is on the groundline of the opponent goal.
00465   */
00466   static bool isOnOpponentGoalGroundline(const Vector2<int> &p);
00467 
00468   /**
00469   * Returns the distance of p to opponents penalty area.
00470   */
00471   static double distanceToOpponentPenaltyArea(const Vector2<double> &p);
00472 
00473   /**
00474   * Returns the distance of p to own penalty area.
00475   */
00476   static double distanceToOwnPenaltyArea(const Vector2<double> &p);
00477   static double distanceToOwnPenaltyArea(const Pose2D &p);
00478 
00479   /**
00480   * Returns the distance to the nearest field border.
00481   */
00482   static double distanceToBorder(const Vector2<double> &p);
00483 
00484   /**
00485   * Returns the vector to the nearest field border.
00486   */
00487   static void vectorToBorder(const Vector2<double> &p, Vector2<double> &result);
00488 
00489   /**
00490   * Returns the vector to the nearest field border including the goals.
00491   */
00492   static void vectorToBorderIncludingGoals(const Vector2<double> &p, Vector2<double> &result);
00493 
00494 
00495   /**
00496   * Clips a line with the field
00497   * @param point1 The starting point of the line
00498   * @param point2 The end point of the line
00499   * @return states whether clipping was necessary (and done)
00500   */
00501   static bool clipLineWithField(
00502    Vector2<int>& point1, 
00503    Vector2<int>& point2
00504    );
00505 
00506    /**
00507   * Clips a line with the field and the areas inside the goals
00508   * @param point1 The starting point of the line
00509   * @param point2 The end point of the line
00510   * @return states whether clipping was necessary (and done)
00511   */
00512   static bool clipLineWithFieldAndGoalAreas(
00513    Vector2<int>& point1, 
00514    Vector2<int>& point2
00515    );
00516 };
00517 
00518 #endif //FieldDimensions

Generated on Mon Mar 20 22:00:05 2006 for GT2005 by doxygen 1.3.6