Field3D
LinearFieldInterp Class Reference

#include <FieldInterp.h>

Inheritance diagram for LinearFieldInterp:
FieldInterp< Data_T >

List of all members.

Public Types

typedef LinearFieldInterp class_type
typedef boost::intrusive_ptr
< LinearFieldInterp
Ptr
typedef Data_T value_type

Public Member Functions

virtual Data_T sample (const Field< Data_T > &data, const V3d &vsP) const

Static Public Member Functions

static const char * classType ()
static const char * staticClassName ()

Public Attributes

 DEFINE_FIELD_RTTI_CONCRETE_CLASS

Private Types

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

Static Private Attributes

static TemplatedFieldType
< LinearFieldInterp< Data_T > > 
ms_classType

Member Typedef Documentation

Reimplemented from FieldInterp< Data_T >.

Definition at line 142 of file FieldInterp.h.

typedef boost::intrusive_ptr<LinearFieldInterp> LinearFieldInterp::Ptr

Reimplemented from FieldInterp< Data_T >.

Definition at line 143 of file FieldInterp.h.

Reimplemented from FieldInterp< Data_T >.

Definition at line 147 of file FieldInterp.h.

typedef FieldInterp<Data_T> LinearFieldInterp::base [private]

Convenience typedef for referring to base class.

Reimplemented from FieldInterp< Data_T >.

Definition at line 173 of file FieldInterp.h.


Member Function Documentation

static const char* LinearFieldInterp::staticClassName ( ) [inline, static]

Reimplemented from FieldInterp< Data_T >.

Definition at line 150 of file FieldInterp.h.

  {
    return "LinearFieldInterp";
  }
static const char* LinearFieldInterp::classType ( ) [inline, static]

Reimplemented from FieldInterp< Data_T >.

Definition at line 155 of file FieldInterp.h.

References ms_classType, and TemplatedFieldType::name().

  {
    return ms_classType.name();
  }
Data_T LinearFieldInterp::sample ( const Field< Data_T > &  data,
const V3d vsP 
) const [virtual]

Implements FieldInterp< Data_T >.

Definition at line 606 of file FieldInterp.h.

References Field::value().

{
  // Voxel 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);

  // Clamp the indexing coordinates
  if (true) {
    const Box3i &dataWindow = data.dataWindow();        
    c1.x = std::max(dataWindow.min.x, std::min(c1.x, dataWindow.max.x));
    c2.x = std::max(dataWindow.min.x, std::min(c2.x, dataWindow.max.x));
    c1.y = std::max(dataWindow.min.y, std::min(c1.y, dataWindow.max.y));
    c2.y = std::max(dataWindow.min.y, std::min(c2.y, dataWindow.max.y));
    c1.z = std::max(dataWindow.min.z, std::min(c1.z, dataWindow.max.z));
    c2.z = std::max(dataWindow.min.z, std::min(c2.z, dataWindow.max.z));
  }
    
  return static_cast<Data_T>
    (f1.x * (f1.y * (f1.z * data.value(c1.x, c1.y, c1.z) +
                     f2.z * data.value(c1.x, c1.y, c2.z)) +
             f2.y * (f1.z * data.value(c1.x, c2.y, c1.z) + 
                     f2.z * data.value(c1.x, c2.y, c2.z))) +
     f2.x * (f1.y * (f1.z * data.value(c2.x, c1.y, c1.z) + 
                     f2.z * data.value(c2.x, c1.y, c2.z)) +
             f2.y * (f1.z * data.value(c2.x, c2.y, c1.z) + 
                     f2.z * data.value(c2.x, c2.y, c2.z))));

}

Member Data Documentation

Reimplemented from FieldInterp< Data_T >.

Definition at line 168 of file FieldInterp.h.

Referenced by classType().


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