Field3D
CubicFieldInterp< Data_T > Class Template Reference

#include <FieldInterp.h>

Inheritance diagram for CubicFieldInterp< Data_T >:
FieldInterp< Data_T > RefBase

Public Types

typedef CubicFieldInterp class_type
 
typedef boost::intrusive_ptr< CubicFieldInterpPtr
 
typedef Data_T value_type
 
- Public Types inherited from FieldInterp< Data_T >
typedef FieldInterp class_type
 
typedef boost::intrusive_ptr< FieldInterpPtr
 
typedef Data_T value_type
 
- Public Types inherited from RefBase
typedef boost::intrusive_ptr< RefBasePtr
 
typedef boost::weak_ptr< RefBaseWeakPtr
 

Public Member Functions

virtual Data_T sample (const Field< Data_T > &data, const V3d &vsP) const
 
- Public Member Functions inherited from FieldInterp< Data_T >
virtual ~FieldInterp ()
 
- Public Member Functions inherited from RefBase
void ref () const
 Used by boost::intrusive_pointer. More...
 
size_t refcnt ()
 Used by boost::intrusive_pointer. More...
 
void unref () const
 Used by boost::intrusive_pointer. More...
 
WeakPtr weakPtr () const
 
 RefBase ()
 
 RefBase (const RefBase &)
 Copy constructor. More...
 
RefBaseoperator= (const RefBase &)
 Assignment operator. More...
 
virtual ~RefBase ()
 Destructor. More...
 
virtual bool checkRTTI (const char *typenameStr)=0
 This function is only implemented by concrete classes and triggers the actual RTTI check through matchRTTI();. More...
 
bool matchRTTI (const char *typenameStr)
 Performs a check to see if the given typename string matches this class' This needs to be implemented in -all- subclasses, even abstract ones. More...
 

Static Public Member Functions

static const char * staticClassName ()
 
static const char * staticClassType ()
 
- Static Public Member Functions inherited from FieldInterp< Data_T >
static const char * staticClassName ()
 
static const char * staticClassType ()
 
- Static Public Member Functions inherited from RefBase
static const char * staticClassType ()
 

Public Attributes

 DEFINE_FIELD_RTTI_CONCRETE_CLASS
 
- Public Attributes inherited from FieldInterp< Data_T >
 DEFINE_FIELD_RTTI_ABSTRACT_CLASS
 

Private Types

typedef FieldInterp< Data_T > base
 Convenience typedef for referring to base class. More...
 

Static Private Attributes

static TemplatedFieldType< CubicFieldInterp< Data_T > > ms_classType
 

Detailed Description

template<class Data_T>
class CubicFieldInterp< Data_T >

Definition at line 195 of file FieldInterp.h.

Member Typedef Documentation

template<class Data_T >
typedef Data_T CubicFieldInterp< Data_T >::value_type

Definition at line 201 of file FieldInterp.h.

template<class Data_T >
typedef boost::intrusive_ptr<CubicFieldInterp> CubicFieldInterp< Data_T >::Ptr

Definition at line 202 of file FieldInterp.h.

template<class Data_T >
typedef CubicFieldInterp CubicFieldInterp< Data_T >::class_type

Definition at line 206 of file FieldInterp.h.

template<class Data_T >
typedef FieldInterp<Data_T> CubicFieldInterp< Data_T >::base
private

Convenience typedef for referring to base class.

Definition at line 232 of file FieldInterp.h.

Member Function Documentation

template<class Data_T >
static const char* CubicFieldInterp< Data_T >::staticClassName ( )
inlinestatic

Definition at line 209 of file FieldInterp.h.

210  {
211  return "CubicFieldInterp";
212  }
template<class Data_T >
static const char* CubicFieldInterp< Data_T >::staticClassType ( )
inlinestatic

Definition at line 214 of file FieldInterp.h.

References FieldInterp< Data_T >::ms_classType, TemplatedFieldType< Field_T >::name(), and FieldInterp< Data_T >::sample().

215  {
216  return ms_classType.name();
217  }
const char * name()
Definition: Traits.h:118
static TemplatedFieldType< CubicFieldInterp< Data_T > > ms_classType
Definition: FieldInterp.h:227
template<class Data_T >
Data_T CubicFieldInterp< Data_T >::sample ( const Field< Data_T > &  data,
const V3d vsP 
) const
virtual

Implements FieldInterp< Data_T >.

Definition at line 651 of file FieldInterp.h.

References FieldRes::dataWindow(), detail::floor(), monotonicCubicInterpolant(), and Field< Data_T >::value().

653 {
654  // Voxel centers are at .5 coordinates
655  // NOTE: Don't use contToDisc for this, we're looking for sample
656  // point locations, not coordinate shifts.
657  V3d clampedVsP(std::max(0.5, vsP.x),
658  std::max(0.5, vsP.y),
659  std::max(0.5, vsP.z));
660  FIELD3D_VEC3_T<double> p(clampedVsP - FIELD3D_VEC3_T<double>(0.5));
661 
662  // Lower left corner
663  V3i c(static_cast<int>(floor(p.x)),
664  static_cast<int>(floor(p.y)),
665  static_cast<int>(floor(p.z)));
666 
667  // Fractions
668  FIELD3D_VEC3_T<double> t(p - static_cast<FIELD3D_VEC3_T<double> >(c));
669 
670  const Box3i &dataWindow = data.dataWindow();
671 
672  // Clamp the coordinates
673  int im, jm, km;
674  im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x));
675  jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y));
676  km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z));
677  int im_1, jm_1, km_1;
678  im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x));
679  jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y));
680  km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z));
681  int im1, jm1, km1;
682  im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x));
683  jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y));
684  km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z));
685  int im2, jm2, km2;
686  im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x));
687  jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y));
688  km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z));
689 
690  // interpolate 16 lines in z:
691  Data_T z11 = monotonicCubicInterpolant(data.value(im_1, jm_1, km_1),
692  data.value(im_1, jm_1, km),
693  data.value(im_1, jm_1, km1),
694  data.value(im_1, jm_1, km2), t.z);
695  Data_T z12 = monotonicCubicInterpolant(data.value(im_1, jm, km_1),
696  data.value(im_1, jm, km),
697  data.value(im_1, jm, km1),
698  data.value(im_1, jm, km2), t.z);
699  Data_T z13 = monotonicCubicInterpolant(data.value(im_1, jm1, km_1),
700  data.value(im_1, jm1, km),
701  data.value(im_1, jm1, km1),
702  data.value(im_1, jm1, km2), t.z);
703  Data_T z14 = monotonicCubicInterpolant(data.value(im_1, jm2, km_1),
704  data.value(im_1, jm2, km),
705  data.value(im_1, jm2, km1),
706  data.value(im_1, jm2, km2), t.z);
707 
708  Data_T z21 = monotonicCubicInterpolant(data.value(im, jm_1, km_1),
709  data.value(im, jm_1, km),
710  data.value(im, jm_1, km1),
711  data.value(im, jm_1, km2), t.z);
712  Data_T z22 = monotonicCubicInterpolant(data.value(im, jm, km_1),
713  data.value(im, jm, km),
714  data.value(im, jm, km1),
715  data.value(im, jm, km2), t.z);
716  Data_T z23 = monotonicCubicInterpolant(data.value(im, jm1, km_1),
717  data.value(im, jm1, km),
718  data.value(im, jm1, km1),
719  data.value(im, jm1, km2), t.z);
720  Data_T z24 = monotonicCubicInterpolant(data.value(im, jm2, km_1),
721  data.value(im, jm2, km),
722  data.value(im, jm2, km1),
723  data.value(im, jm2, km2), t.z);
724 
725  Data_T z31 = monotonicCubicInterpolant(data.value(im1, jm_1, km_1),
726  data.value(im1, jm_1, km),
727  data.value(im1, jm_1, km1),
728  data.value(im1, jm_1, km2), t.z);
729  Data_T z32 = monotonicCubicInterpolant(data.value(im1, jm, km_1),
730  data.value(im1, jm, km),
731  data.value(im1, jm, km1),
732  data.value(im1, jm, km2), t.z);
733  Data_T z33 = monotonicCubicInterpolant(data.value(im1, jm1, km_1),
734  data.value(im1, jm1, km),
735  data.value(im1, jm1, km1),
736  data.value(im1, jm1, km2), t.z);
737  Data_T z34 = monotonicCubicInterpolant(data.value(im1, jm2, km_1),
738  data.value(im1, jm2, km),
739  data.value(im1, jm2, km1),
740  data.value(im1, jm2, km2), t.z);
741 
742  Data_T z41 = monotonicCubicInterpolant(data.value(im2, jm_1, km_1),
743  data.value(im2, jm_1, km),
744  data.value(im2, jm_1, km1),
745  data.value(im2, jm_1, km2), t.z);
746  Data_T z42 = monotonicCubicInterpolant(data.value(im2, jm, km_1),
747  data.value(im2, jm, km),
748  data.value(im2, jm, km1),
749  data.value(im2, jm, km2), t.z);
750  Data_T z43 = monotonicCubicInterpolant(data.value(im2, jm1, km_1),
751  data.value(im2, jm1, km),
752  data.value(im2, jm1, km1),
753  data.value(im2, jm1, km2), t.z);
754  Data_T z44 = monotonicCubicInterpolant(data.value(im2, jm2, km_1),
755  data.value(im2, jm2, km),
756  data.value(im2, jm2, km1),
757  data.value(im2, jm2, km2), t.z);
758 
759  Data_T y1 = monotonicCubicInterpolant(z11, z12, z13, z14, t.y);
760  Data_T y2 = monotonicCubicInterpolant(z21, z22, z23, z24, t.y);
761  Data_T y3 = monotonicCubicInterpolant(z31, z32, z33, z34, t.y);
762  Data_T y4 = monotonicCubicInterpolant(z41, z42, z43, z44, t.y);
763 
764  Data_T z0 = monotonicCubicInterpolant(y1, y2, y3, y4, t.x);
765 
766  return z0;
767 }
Imath::Box3i Box3i
Definition: SpiMathLib.h:77
Imath::V3i V3i
Definition: SpiMathLib.h:71
FIELD3D_VEC3_T< T > floor(const FIELD3D_VEC3_T< T > &v)
Floor function for Vec3.
Definition: CoordSys.h:95
Imath::V3d V3d
Definition: SpiMathLib.h:74
const Box3i & dataWindow() const
Returns the data window. Any coordinate inside this window is safe to pass to value() in the Field su...
Definition: Field.h:258
virtual Data_T value(int i, int j, int k) const =0
Read access to a voxel. The coordinates are in integer voxel space .
Data_T monotonicCubicInterpolant(const Data_T &f1, const Data_T &f2, const Data_T &f3, const Data_T &f4, double t)
Monotonic cubic interpolation References: http://en.wikipedia.org/wiki/Monotone_cubic_interpolation h...

Member Data Documentation

template<class Data_T >
CubicFieldInterp< Data_T >::DEFINE_FIELD_RTTI_CONCRETE_CLASS

Definition at line 207 of file FieldInterp.h.

template<class Data_T >
TemplatedFieldType<CubicFieldInterp<Data_T> > CubicFieldInterp< Data_T >::ms_classType
staticprivate

Definition at line 227 of file FieldInterp.h.


The documentation for this class was generated from the following file: