00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef __ENKI_IRSENSOR_H
00035 #define __ENKI_IRSENSOR_H
00036
00037 #include <enki/PhysicalEngine.h>
00038 #include <enki/Interaction.h>
00039
00040 #include <valarray>
00041 #undef min
00042
00047 namespace Enki
00048 {
00053
00054
00055 struct SensorResponseFunctor
00056 {
00058 virtual ~SensorResponseFunctor() {}
00060 virtual double operator()(double, const Color &) = 0;
00061 };
00062
00064
00065 class IRSensor : public LocalInteraction
00066 {
00067 protected:
00069 Vector absPos;
00071 double absOrientation;
00073 Vector pos;
00075 double height;
00077 double orientation;
00079 double range;
00081 double aperture;
00083 unsigned rayCount;
00085
00088 std::valarray<SensorResponseFunctor *> sensorResponseKernel;
00089
00091 double smartRadius;
00093 Point smartPos;
00095 Vector absSmartPos;
00097 std::valarray<double> rayValues;
00099 std::valarray<Color> rayColors;
00101 std::valarray<double> rayAngles;
00103 std::valarray<double> absRayAngles;
00104
00105 public:
00107 double finalValue;
00108
00109 public:
00113 IRSensor(Robot *owner, Vector pos, double height, double orientation, double range, double aperture, unsigned rayCount, SensorResponseFunctor **sensorResponseKernel);
00115 void init(double dt, World* w);
00117 void objectStep(double dt, World *w, PhysicalObject *po);
00119 void wallsStep(double dt, World* w);
00121 void finalize(double dt, World* w);
00122
00124 Point getAbsolutePosition(void) { return absPos; }
00126 double getAbsoluteOrientation(void) { return absOrientation; }
00128 unsigned getRayCount(void) { return rayCount; }
00130 double getAperture(void) { return aperture; }
00132 double getRange(void) { return range; }
00134 double getSmartRadius(void) { return smartRadius; }
00136 Point getAbsSmartPos(void) { return absSmartPos; }
00138 double getDist(void) { double val = rayValues[rayValues.size() / 2]; return std::min(val, range); }
00139
00140 private:
00143 double distanceToPolygon(double rayAngle, const Polygone &p) const;
00144 };
00145 }
00146
00147 #endif