DGtal 0.3.0

SeparableMetricTraits.h

Go to the documentation of this file.
00001 
00017 #pragma once
00018 
00031 #if defined(SeparableMetricTraits_RECURSES)
00032 #error Recursive header files inclusion detected in SeparableMetricTraits.h
00033 #else // defined(SeparableMetricTraits_RECURSES)
00034 
00035 #define SeparableMetricTraits_RECURSES
00036 
00037 #if !defined SeparableMetricTraits_h
00038 
00039 #define SeparableMetricTraits_h
00040 
00042 // Inclusions
00043 #include <iostream>
00044 #include <cmath>
00045 #include "DGtal/base/Common.h"
00046 #include "DGtal/kernel/IntegerTraits.h"
00048 #include <boost/concept_check.hpp>
00049 
00050 namespace DGtal
00051 {
00052 
00054   // template class SeparableMetricTraits
00070   template <typename TAbscissa, typename TInternalValue, DGtal::uint32_t tp>
00071   struct SeparableMetricTraits
00072   {
00073     // ----------------------- Standard services ------------------------------
00074 
00075     typedef TInternalValue InternalValue;
00076     typedef TAbscissa Abscissa;
00077 
00082     static const DGtal::uint32_t p = tp;
00083 
00084 
00093     double getApproxValue( const InternalValue & aInternalValue ) const
00094     {
00095       return std::pow( IntegerTraits<InternalValue>::castToDouble(aInternalValue),
00096                       (double) 1.0 / p);
00097     }
00098 
00109     InternalValue F ( const Abscissa pos, const Abscissa ci, const InternalValue hi ) const
00110     {
00111       return std::pow( fabs(IntegerTraits<Abscissa>::castToDouble(pos - ci)),
00112                        (double)p) + hi;
00113     }
00114 
00125     InternalValue reversedF ( const Abscissa pos, const Abscissa ci, const InternalValue hi ) const
00126     {
00127       return hi - std::pow( fabs((double )pos - ci) , (double)p);
00128     }
00129 
00130 
00139     InternalValue power ( const Abscissa pos ) const
00140     {
00141       return ( InternalValue ) std::pow ( pos, p );
00142     }
00143 
00144 
00156     Abscissa reversedSep ( const Abscissa i, const InternalValue hi, const Abscissa j, const InternalValue hj ) const
00157     {
00158       ASSERT(false && "Not-Yet-Implemented");
00159     }
00160     
00172     Abscissa Sep ( const Abscissa i, const InternalValue hi, const Abscissa j, const InternalValue hj ) const
00173     {
00174       ASSERT(false && "Not-Yet-Implemented");
00175     }
00176 
00177 
00178   }; // end of class SeparableMetricTraits
00179 
00180   // ------------------------------------------------------------------------
00181   // -----------------------  Specializations   ------------------------------
00182   // ------------------------------------------------------------------------
00183 
00188   template <typename TAbscissa, typename TInternalValue>
00189   struct SeparableMetricTraits<TAbscissa, TInternalValue, 2>
00190   {
00191     typedef TInternalValue InternalValue;
00192     typedef TAbscissa Abscissa;
00193                 
00194     static const DGtal::uint32_t p = 2;
00195 
00196     inline double getApproxValue ( const InternalValue & aInternalValue ) const
00197     {
00198       return ( double ) sqrt ( IntegerTraits<InternalValue>::castToDouble(aInternalValue) );
00199     }
00200 
00201     inline InternalValue F ( const Abscissa pos, 
00202                              const Abscissa ci, 
00203                              const InternalValue hi ) const
00204     {
00205       return ( pos - ci ) * ( pos - ci ) + hi;
00206     }
00207 
00208     inline InternalValue reversedF ( const Abscissa pos, 
00209                                      const Abscissa ci, 
00210                                      const InternalValue hi ) const
00211     {
00212       return hi - ( pos - ci ) * ( pos - ci ) ;
00213     }
00214 
00215 
00216     inline Abscissa Sep ( const Abscissa i, const InternalValue hi, 
00217                           const Abscissa j, const InternalValue hj ) const
00218     {
00220       return ( ( j*j - i*i ) + hj - hi )  / ( 2* ( j - i ) );
00221     }
00222 
00223     inline Abscissa reversedSep ( const Abscissa i, const InternalValue hi, 
00224                                   const Abscissa j, const InternalValue hj ) const
00225     {
00227       return ( ( i*i -j*j ) + hj - hi )  / ( 2* ( i - j ) );
00228     }
00229 
00230     inline InternalValue power ( const Abscissa i ) const
00231     {
00232       return (InternalValue) (i*i);
00233     }
00234   };
00235 
00240   template <typename TAbscissa, typename TInternalValue>
00241   struct SeparableMetricTraits<TAbscissa, TInternalValue, 1>
00242   {
00243 
00244     typedef TInternalValue InternalValue;
00245     static const DGtal::uint32_t p = 1;
00246     typedef TAbscissa Abscissa;
00247                 
00248 
00249     inline double getApproxValue ( const InternalValue & aInternalValue ) const
00250     {
00251       return ( double ) aInternalValue;
00252     }
00253  
00254     inline InternalValue F ( const Abscissa pos, 
00255                              const Abscissa ci, 
00256                              const InternalValue hi ) const
00257     {
00258       return ( InternalValue ) std::abs ( (long int) pos - ci ) + hi;
00259     }
00260 
00261     inline InternalValue reversedF ( const Abscissa pos, 
00262                                      const Abscissa ci, 
00263                                      const InternalValue hi ) const
00264     {
00265       return ( InternalValue ) hi - abs ( pos - ci );
00266     }
00267 
00268 
00269     inline Abscissa Sep ( const Abscissa i, const InternalValue hi, 
00270                           const Abscissa j, const InternalValue hj ) const
00271     {
00272       if (hj >= hi + j - i)
00273         return IntegerTraits<Abscissa>::max();
00274       if (hi > hj + j - i)
00275         return IntegerTraits<Abscissa>::min();
00276       return (hj - hi + j + i) / 2;
00277     }
00278 
00279     inline Abscissa reversedSep ( const Abscissa i, const InternalValue hi, 
00280                           const Abscissa j, const InternalValue hj ) const
00281     {
00282       ASSERT(false && "Not-Yet-Implemented");
00283     }
00284 
00285 
00286     
00287     
00288 
00289     inline InternalValue power ( const Abscissa i ) const
00290     {
00291       return (InternalValue) std::abs((long int)i);
00292     }
00293 
00294   }; // end of class SeparableMetricTraits
00295 
00300   template <typename TAbscissa, typename TInternalValue>
00301   struct SeparableMetricTraits<TAbscissa, TInternalValue, 0>
00302   {
00303     typedef TAbscissa Abscissa;
00304     typedef TInternalValue InternalValue;
00305     static const DGtal::uint32_t p = 0;
00306  
00307     inline double getApproxValue ( const InternalValue & aInternalValue ) const
00308     {
00309       return ( double ) aInternalValue;
00310     }
00311 
00312     inline InternalValue F ( const Abscissa pos, const Abscissa ci, 
00313                              const InternalValue hi ) const
00314     {
00315       return ( InternalValue ) std::max( (Abscissa)std::abs ( (long int)pos - ci ) , (Abscissa) hi);
00316     }
00317 
00318     inline InternalValue reversedF ( const Abscissa pos, 
00319                                      const Abscissa ci, 
00320                                      const InternalValue hi ) const
00321     {
00322      return ( InternalValue ) std::min( 2*hi - (Abscissa)abs ( pos - ci ) , (Abscissa) hi);
00323     }
00324 
00325 
00326     inline Abscissa Sep ( const Abscissa i, const InternalValue hi,
00327                           const Abscissa j, const InternalValue hj ) const
00328     {
00329       if (hi <= hj)
00330         return std::max ((Abscissa)(i + hj), (Abscissa)(i + j) / 2);
00331       else
00332         return std::min ((Abscissa)(j - hi), (Abscissa)(i + j) / 2);
00333     }
00334 
00335     inline Abscissa reversedSep ( const Abscissa i, const InternalValue hi,
00336                           const Abscissa j, const InternalValue hj ) const
00337     {
00338       ASSERT(false && "not yet implemented");
00339     }
00340 
00341     
00342 
00343     inline InternalValue power ( const Abscissa i ) const
00344     {
00346       return (InternalValue) std::abs((long int)i);
00347     }
00348 
00349   }; // end of class SeparableMetricTraits
00350 
00351 
00352 } // namespace DGtal
00353 
00354 
00356 // Includes inline functions.
00357 #include "DGtal/geometry/nd/volumetric/SeparableMetricTraits.ih"
00358 
00359 //                                                                           //
00361 
00362 #endif // !defined SeparableMetricTraits_h
00363 
00364 #undef SeparableMetricTraits_RECURSES
00365 #endif // else defined(SeparableMetricTraits_RECURSES)
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines