00001 #ifndef animal_picking_h
00002 #define animal_picking_h
00003
00004 #include <animal/linear.h>
00005 #include <animal/container_traits.h>
00006
00007
00008 namespace animal {
00009
00013 class ConstrainedItem
00014 {
00015 public:
00017 virtual void getPoint( float&, float&, float& ) const {}
00018
00021 virtual void moveTo( float, float, float ) {}
00022
00024 virtual ~ConstrainedItem(){}
00025
00027 virtual void print() const {}
00028
00031 virtual bool operator == ( const ConstrainedItem* ) const =0;
00032
00033 virtual void draw() {};
00034 };
00035
00036
00037
00046 template<class Int, class Real, class Points, class Vec>
00047 inline bool findClosestPointToLine( Int& index, Real& distance, const Points& coords, const Vec& lineOrigin, const Vec& lineDirection, Real threshold )
00048 {
00049
00050 distance = threshold + 1;
00051 for( Int i=0; i<static_cast<Int>(size(coords)); ++i )
00052 {
00053 Vec gap = coords[i];
00054 v_meq( gap,lineOrigin );
00055
00056 Real gapnorm = v_norm(gap);
00057 if( gapnorm < 1.0e-9 ) {
00058 distance=gapnorm;
00059 index = i;
00060 return true;
00061 }
00062 else {
00063 Real cosine = v_dot(gap,lineDirection) / gapnorm;
00064
00065 if( cosine>1-distance )
00066 {
00067 distance = 1-cosine;
00068 index = i;
00069 }
00070 }
00071 }
00072 if( distance<threshold ) return true;
00073 else return false;
00074 }
00075
00076
00077
00078
00079
00080
00081
00082 }
00083
00084 #endif