00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "LinesTables2005.h"
00010 #include "Tools/Debugging/Debugging.h"
00011 #include "Tools/Streams/InStreams.h"
00012
00013 Field LinesTables2005::field;
00014 LinesTables2005::ObsTable* LinesTables2005::observationTable = 0;
00015 LinesTables2005::TempTable* LinesTables2005::templateTable = 0;
00016 int LinesTables2005::refCount = 0;
00017
00018
00019
00020
00021 static const char* fileName = "lines05.tab";
00022
00023 LinesTables2005::LinesTables2005()
00024 {
00025 if(!refCount++)
00026 {
00027 int i;
00028 observationTable = new ObsTable[LinesPercept::numberOfLineTypes];
00029 templateTable = new TempTable;
00030
00031 #ifdef SAVE
00032 OutBinaryFile stream(fileName);
00033 for(i = 0; i < LinesPercept::numberOfLineTypes; ++i)
00034 {
00035 observationTable[i].create(field,LinesPercept::LineType(i));
00036 stream << observationTable[i];
00037 }
00038
00039
00040 templateTable->create(field,LinesPercept::yellowGoal);
00041 stream << *templateTable;
00042 #else
00043 InBinaryFile stream(fileName);
00044 if(stream.exists())
00045 {
00046 for(i = 0; i < LinesPercept::numberOfLineTypes; ++i)
00047 stream >> observationTable[i];
00048 stream >> *templateTable;
00049 }
00050 else
00051 {
00052 OUTPUT(idText, text, "LinesTables2005 : " << fileName << " not found");
00053 }
00054 #endif
00055 }
00056 }
00057
00058 LinesTables2005::~LinesTables2005()
00059 {
00060 if(!--refCount)
00061 {
00062 delete [] observationTable;
00063 delete templateTable;
00064 }
00065 }
00066
00067 template<int xSize,int ySize,int cellSize,int pointRes> void LinesTables2005::ObservationTable<xSize,ySize,cellSize,pointRes>::create(const Field& field,LinesPercept::LineType type)
00068 {
00069 for(int r = 0; r < 4; ++r)
00070 for(int y = 0; y < ySize; ++y)
00071 for(int x = 0; x < xSize; ++x)
00072 {
00073 Vector2<double> px(
00074 (x + 0.5 - xSize / 2) * cellSize,
00075 (y + 0.5 - ySize / 2) * cellSize
00076 );
00077 Vector2<double> p;
00078 if(
00079 field.getClosestPoint(
00080 p,
00081 Pose2D(r * pi_2, px),
00082 4,
00083 type))
00084 {
00085 #ifdef BOUNDARYASFIELDLINE
00086 if (type == LinesPercept::field)
00087 {
00088 Vector2<double> p2 = field.getClosestPoint(
00089 Pose2D(r * pi_2, px),
00090 4,
00091 LinesPercept::boundary);
00092 if ((p2 - px).abs() < (p - px).abs())
00093 p = p2;
00094 }
00095 #endif
00096 point[r][y][x][0] = char(sgn(p.x) * int(fabs(p.x / pointRes + 0.5)));
00097 point[r][y][x][1] = char(sgn(p.y) * int(fabs(p.y / pointRes + 0.5)));
00098 pointIsValid[r][y][x] = true;
00099 }
00100 else
00101 pointIsValid[r][y][x] = false;
00102 }
00103 }