Field3D
LinearGenericFieldInterp< Field_T > Class Template Reference

#include <FieldInterp.h>

Inheritance diagram for LinearGenericFieldInterp< Field_T >:
RefBase RefBase

List of all members.

Public Types

typedef boost::intrusive_ptr
< LinearGenericFieldInterp
Ptr
typedef boost::intrusive_ptr
< LinearGenericFieldInterp
Ptr

Public Member Functions

Field_T::value_type sample (const Field_T &data, const V3d &vsP) const
Field_T::value_type sample (const Field_T &data, const V3d &vsP) const

Detailed Description

template<class Field_T>
class LinearGenericFieldInterp< Field_T >

Definition at line 130 of file FieldInterp.h.


Member Typedef Documentation

template<class Field_T >
typedef boost::intrusive_ptr<LinearGenericFieldInterp> LinearGenericFieldInterp< Field_T >::Ptr

Reimplemented from RefBase.

Definition at line 133 of file FieldInterp.h.

template<class Field_T >
typedef boost::intrusive_ptr<LinearGenericFieldInterp> LinearGenericFieldInterp< Field_T >::Ptr

Reimplemented from RefBase.

Definition at line 133 of file FieldInterp.h.


Member Function Documentation

template<class Field_T >
Field_T::value_type LinearGenericFieldInterp< Field_T >::sample ( const Field_T &  data,
const V3d vsP 
) const

Definition at line 450 of file FieldInterp.h.

{
  typedef typename Field_T::value_type Data_T;

  // Pixel centers are at .5 coordinates
  // NOTE: Don't use contToDisc for this, we're looking for sample
  // point locations, not coordinate shifts.
  FIELD3D_VEC3_T<double> p(vsP - FIELD3D_VEC3_T<double>(0.5));

  // Lower left corner
  V3i c1(static_cast<int>(floor(p.x)), 
         static_cast<int>(floor(p.y)), 
         static_cast<int>(floor(p.z)));
  // Upper right corner
  V3i c2(c1 + V3i(1));
  // C1 fractions
  FIELD3D_VEC3_T<double> f1(static_cast<FIELD3D_VEC3_T<double> >(c2) - p);
  // C2 fraction
  FIELD3D_VEC3_T<double> f2(static_cast<FIELD3D_VEC3_T<double> >(1.0) - f1);

  const Box3i &dataWindow = data.dataWindow();        

  // Clamp the coordinates
  c1.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c1.x));
  c1.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c1.y));
  c1.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c1.z));
  c2.x = std::min(dataWindow.max.x, std::max(dataWindow.min.x, c2.x));
  c2.y = std::min(dataWindow.max.y, std::max(dataWindow.min.y, c2.y));
  c2.z = std::min(dataWindow.max.z, std::max(dataWindow.min.z, c2.z));

  return static_cast<Data_T>
    (f1.x * (f1.y * (f1.z * data.fastValue(c1.x, c1.y, c1.z) +
                     f2.z * data.fastValue(c1.x, c1.y, c2.z)) +
             f2.y * (f1.z * data.fastValue(c1.x, c2.y, c1.z) + 
                     f2.z * data.fastValue(c1.x, c2.y, c2.z))) +
     f2.x * (f1.y * (f1.z * data.fastValue(c2.x, c1.y, c1.z) + 
                     f2.z * data.fastValue(c2.x, c1.y, c2.z)) +
             f2.y * (f1.z * data.fastValue(c2.x, c2.y, c1.z) + 
                     f2.z * data.fastValue(c2.x, c2.y, c2.z))));
}
template<class Field_T >
Field_T::value_type LinearGenericFieldInterp< Field_T >::sample ( const Field_T &  data,
const V3d vsP 
) const

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