00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 #include <math.h>
00016 #include <math/math2.h>
00017 
00018 
00019 
00020 #include "kinematics\Configuration.h"
00021 
00022 #include "CollisionDetectors\CD_JointLimits.h"
00023 
00024 
00025 
00026 
00027 
00028 
00029 CD_JointLimits::~CD_JointLimits()
00030 {
00031   
00032   
00033 }
00034 
00035 
00036 
00037 
00038 double CD_JointLimits::DistanceBetween (const Configuration& c1, const Configuration& c2) const
00039 {
00040   
00041         double distance = 0 ;
00042         for( int i = 0; i < c1.DOF(); i++ )
00043         {
00044                 double addme = 0 ;
00045                 double jmax = JointMax( i ) ;
00046                 double jmin = JointMin( i ) ;
00047                 double a1 = fabs( c2[ i ] - c1[ i ] ) ;
00048                 if( JointWraps( i ) )
00049                 {
00050                         double a2 = fabs( jmax - c1[ i ] ) + fabs( c2[ i ] - jmin ) ;
00051                         double a3 = fabs( jmax - c2[ i ] ) + fabs( c1[ i ] - jmin ) ;
00052                         addme = Min( a1, a2, a3 ) ;             
00053                 }
00054                 else
00055                 {
00056                         addme = a1 ;
00057                 }
00058                 distance += addme ;
00059         }
00060         return distance ;
00061   
00062 }
00063 
00064 VectorN CD_JointLimits::JointDisplacement( const Configuration& c1, const Configuration& c2) const
00065 {
00066         int dof = c1.DOF();
00067         VectorN displacement;
00068 
00069         displacement.SetLength( dof );
00070 
00071         double diff;
00072 
00073         for (int i=0; i < dof; i++ )
00074         {
00075                 
00076                 double diff1 = c2[i] - c1[i];
00077 
00078                 double jrange = JointMax( i ) - JointMin( i );
00079                 
00080                 
00081                 if ( JointWraps( i ) )
00082                 {
00083                         double diff2 = ( jrange + c2[i] ) - c1[i];
00084                         double diff3 = c2[i] - ( jrange + c1[i] );
00085                         diff = MinMag ( diff1, diff2, diff3 );
00086                 }
00087                 else
00088                 {
00089                         diff = diff1;
00090                 }
00091 
00092                 
00093                 displacement[i] = diff;
00094 
00095         }
00096 
00097         return displacement;
00098 }
00099 
00100 
00101 
00102   
00103   
00104 
00105 
00106