00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "BallPercept.h"
00012 #include <math.h>
00013
00014 BallPercept& BallPercept::operator=(const BallPercept& other)
00015 {
00016 cameraInfo = other.cameraInfo;
00017 ballCenter = other.ballCenter;
00018 ballRadiusInPixel = other.ballRadiusInPixel;
00019 anglesToCenter = other.anglesToCenter;
00020 ballRadiusAsAngle = other.ballRadiusAsAngle;
00021 ballWasSeen = other.ballWasSeen;
00022 frameNumber = other.frameNumber;
00023 isCameraMatrixValid = other.isCameraMatrixValid;
00024 translationOfCamera = other.translationOfCamera;
00025 return *this;
00026 }
00027
00028 void BallPercept::add(
00029 Vector2<double> anglesToCenter,
00030 double ballRadiusAsAngle,
00031 Vector3<double> translationOfCamera,
00032 bool isCameraMatrixValid
00033 )
00034 {
00035 this->anglesToCenter = anglesToCenter;
00036 this->ballRadiusAsAngle = ballRadiusAsAngle;
00037 this->translationOfCamera = translationOfCamera;
00038 this->isCameraMatrixValid = isCameraMatrixValid;
00039 ballWasSeen = true;
00040 }
00041
00042 void BallPercept::add(
00043 CameraInfo cameraInfo,
00044 Vector2<int> ballCenter,
00045 double ballRadiusInPixel,
00046 Vector2<double> anglesToCenter,
00047 double ballRadiusAsAngle,
00048 Vector3<double> translationOfCamera,
00049 bool isCameraMatrixValid
00050 )
00051 {
00052 this->cameraInfo = cameraInfo;
00053 this->ballCenter = ballCenter;
00054 this->ballRadiusInPixel = ballRadiusInPixel;
00055 this->anglesToCenter = anglesToCenter;
00056 this->ballRadiusAsAngle = ballRadiusAsAngle;
00057 this->translationOfCamera = translationOfCamera;
00058 this->isCameraMatrixValid = isCameraMatrixValid;
00059 ballWasSeen = true;
00060 }
00061
00062 void BallPercept::getOffsetBearingBased(Vector2<double>& offset) const
00063 {
00064 double distanceBearingBased;
00065 if(anglesToCenter.y < 0)
00066 {
00067 distanceBearingBased = (translationOfCamera.z - ballRadius) / tan(-anglesToCenter.y);
00068 }
00069 else
00070 {
00071 distanceBearingBased = 10000;
00072 }
00073
00074 offset.x = translationOfCamera.x + distanceBearingBased * cos(anglesToCenter.x);
00075 offset.y = translationOfCamera.y + distanceBearingBased * sin(anglesToCenter.x);
00076 checkOffset(offset);
00077 }
00078
00079 void BallPercept::getOffsetIntrinsic(Vector2<double>& offset) const
00080 {
00081 double distanceSizeBased = Geometry::getDistanceBySize(
00082 cameraInfo,
00083 (int)ballRadius,
00084 ballRadiusInPixel,
00085 ballCenter.x,
00086 ballCenter.y
00087 );
00088
00089
00090 double distanceFromCameraToBallCenterOnGround;
00091
00092 if(distanceSizeBased > fabs(translationOfCamera.z - ballRadius))
00093 {
00094 distanceFromCameraToBallCenterOnGround = sqrt(sqr(distanceSizeBased) - sqr(translationOfCamera.z - ballRadius));
00095 }
00096 else
00097 {
00098 distanceFromCameraToBallCenterOnGround = 0;
00099 }
00100
00101 offset.x = translationOfCamera.x + distanceFromCameraToBallCenterOnGround * cos(anglesToCenter.x);
00102 offset.y = translationOfCamera.y + distanceFromCameraToBallCenterOnGround * sin(anglesToCenter.x);
00103 checkOffset(offset);
00104 }
00105
00106 void BallPercept::getOffsetSizeBased(Vector2<double>& offset) const
00107 {
00108 double distanceFromCameraToBallCenter =
00109 Geometry::getBallDistanceByAngleSize(int(2 * ballRadius), 2 * ballRadiusAsAngle);
00110
00111 double distanceFromCameraToBallCenterOnGround;
00112
00113 if(distanceFromCameraToBallCenter > fabs(translationOfCamera.z - ballRadius))
00114 {
00115 distanceFromCameraToBallCenterOnGround = sqrt(sqr(distanceFromCameraToBallCenter) - sqr(translationOfCamera.z - ballRadius));
00116 }
00117 else
00118 {
00119 distanceFromCameraToBallCenterOnGround = 0;
00120 }
00121
00122 offset.x = translationOfCamera.x + distanceFromCameraToBallCenterOnGround * cos(anglesToCenter.x);
00123 offset.y = translationOfCamera.y + distanceFromCameraToBallCenterOnGround * sin(anglesToCenter.x);
00124 checkOffset(offset);
00125 }
00126
00127 void BallPercept::getOffset(Vector2<double>& offset) const
00128 {
00129 if(!isCameraMatrixValid || anglesToCenter.y >= 0 || (getDistanceSizeBased() > 300.0))
00130 getOffsetSizeBased(offset);
00131 else if (getDistanceSizeBased() > 200.0)
00132 {
00133
00134 double factor = (300.0 - getDistanceSizeBased()) / 100.0;
00135 Vector2<double> offsetSize, offsetBearing;
00136 getOffsetSizeBased(offsetSize);
00137 getOffsetBearingBased(offsetBearing);
00138 offset = offsetBearing * factor + offsetSize * (1.0 - factor);
00139 }
00140 else
00141 getOffsetBearingBased(offset);
00142 }
00143
00144 double BallPercept::getDistance() const
00145 {
00146 Vector2<double> offset;
00147 getOffset(offset);
00148 return offset.abs();
00149 }
00150
00151 double BallPercept::getAngle() const
00152 {
00153 Vector2<double> offset;
00154 getOffset(offset);
00155 return offset.angle();
00156 }
00157
00158 double BallPercept::getDistanceBearingBased() const
00159 {
00160 Vector2<double> offset;
00161 getOffsetBearingBased(offset);
00162 return offset.abs();
00163 }
00164
00165 double BallPercept::getDistanceSizeBased() const
00166 {
00167 Vector2<double> offset;
00168 getOffsetSizeBased(offset);
00169 return offset.abs();
00170 }
00171
00172 double BallPercept::getAngleBearingBased() const
00173 {
00174 Vector2<double> offset;
00175 getOffsetBearingBased(offset);
00176 return offset.angle();
00177 }
00178
00179 double BallPercept::getAngleSizeBased() const
00180 {
00181 Vector2<double> offset;
00182 getOffsetSizeBased(offset);
00183 return offset.angle();
00184 }
00185
00186 double BallPercept::getDistanceIntrinsicBased() const
00187 {
00188 Vector2<double> offset;
00189 getOffsetIntrinsic(offset);
00190 return offset.abs();
00191 }
00192
00193 double BallPercept::getAngleIntrinsicBased() const
00194 {
00195 Vector2<double> offset;
00196 getOffsetIntrinsic(offset);
00197 return offset.angle();
00198 }
00199
00200 In& operator>>(In& stream,BallPercept& ballPercept)
00201 {
00202 int temp;
00203 stream >> ballPercept.ballCenter;
00204 stream >> ballPercept.ballRadiusInPixel;
00205 stream >> ballPercept.cameraInfo;
00206 stream >> ballPercept.anglesToCenter.x;
00207 stream >> ballPercept.anglesToCenter.y;
00208 stream >> ballPercept.ballRadiusAsAngle;
00209 stream >> ballPercept.translationOfCamera.x;
00210 stream >> ballPercept.translationOfCamera.y;
00211 stream >> ballPercept.translationOfCamera.z;
00212 stream >> temp;
00213 ballPercept.ballWasSeen = (temp != 0);
00214 stream >> ballPercept.frameNumber;
00215 stream >> temp;
00216 ballPercept.isCameraMatrixValid = (temp != 0);
00217 return stream;
00218 }
00219
00220 Out& operator<<(Out& stream, const BallPercept& ballPercept)
00221 {
00222 stream << ballPercept.ballCenter;
00223 stream << ballPercept.ballRadiusInPixel;
00224 stream << ballPercept.cameraInfo;
00225 stream << ballPercept.anglesToCenter.x;
00226 stream << ballPercept.anglesToCenter.y;
00227 stream << ballPercept.ballRadiusAsAngle;
00228 stream << ballPercept.translationOfCamera.x;
00229 stream << ballPercept.translationOfCamera.y;
00230 stream << ballPercept.translationOfCamera.z;
00231 stream << ballPercept.ballWasSeen;
00232 stream << ballPercept.frameNumber;
00233 stream << ballPercept.isCameraMatrixValid;
00234 return stream;
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369