$search
00001 00007 #ifndef P_SPOLYGON_HH 00008 #define P_SPOLYGON_HH 00009 00010 //#define USE_VS_CLOSURES 00011 00012 #include <float.h> 00013 #include <map> 00014 #include <blort/Recognizer3D/Vector2.hh> 00015 #include <blort/Recognizer3D/PNamespace.hh> 00016 #include <blort/Recognizer3D/Array.hh> 00017 00018 #ifdef USE_VS_CLOSURES 00019 #include <blort/Recognizer3D/Closure.hh> 00020 #endif 00021 00022 namespace P 00023 { 00024 00025 class SPolygon 00026 { 00027 public: 00028 Array<Vector2> v; 00029 Vector2 center; //center of gravity 00030 unsigned p; //pointer to a proto object 00031 00032 SPolygon(); 00033 #ifdef USE_VS_CLOSURES 00034 SPolygon(Closure *c); 00035 #endif 00036 SPolygon(Array<Vector2> &p); 00037 ~SPolygon(){}; 00038 void SetConvexHull(Array<Vector2> &p); 00039 void Expand(double d); 00040 bool Inside(double x, double y); 00041 bool OnContour(double x, double y, double eps); 00042 inline bool Inside(Vector2 &p) {return Inside(p.x,p.y);} 00043 inline void Clear(){v.Clear();} 00044 inline unsigned Size(){return v.Size();} 00045 inline void PushBack(Vector2 &p){v.PushBack(p);} 00046 inline unsigned NumVertices(){return v.Size();} 00047 inline void Insert(Vector2 &p){v.PushBack(p);} 00048 inline void Move(Vector2 &dist); 00049 inline double Area(){return SPolygon::Area(v);} 00050 void CenterOfGravity(); 00051 00052 static bool Inside(Array<Vector2> &vs, Vector2 &p); 00053 static double NearestLine(Vector2 &p, Array<Vector2> &vs, unsigned &id); 00054 static double NearestNeighbour(Vector2 &p, Array<Vector2> &vs, unsigned &id); 00055 static double Match(Array<Vector2> &vs1, Array<Vector2> &vs2); 00056 static void CenterOfGravity(Array<Vector2> &vs, Vector2 &vc); 00057 static double Area ( Array<Vector2> &vs ); 00058 static void Load(ifstream &is, SPolygon &p); 00059 static void Save(ofstream &os, const SPolygon &p); 00060 00061 SPolygon &operator=(const SPolygon &p); 00062 Vector2& operator[](unsigned i){return v[i];} 00063 }; 00064 00065 00066 /************************ INLINE METHODES *******************************/ 00067 inline void SPolygon::CenterOfGravity() 00068 { 00069 if (v.Size()>0){ 00070 center=P::Vector2(0.,0.); 00071 for (unsigned i=0; i<v.Size(); i++) 00072 center+=v[i]; 00073 center/=v.Size(); 00074 } 00075 } 00076 00080 inline void SPolygon::Move(Vector2 &dist) 00081 { 00082 if (center.x!=DBL_MAX) 00083 center+=dist; 00084 for (unsigned i=0; i<v.Size(); i++) 00085 v[i]+=dist; 00086 } 00087 00088 00089 } 00090 00091 #endif 00092