Field3D
|
#include <FieldInterp.h>
Public Types | |
typedef boost::intrusive_ptr < LinearFieldInterp > | Ptr |
typedef boost::intrusive_ptr < LinearFieldInterp > | Ptr |
Public Member Functions | |
virtual Data_T | sample (const Field< Data_T > &data, const V3d &vsP) const |
virtual Data_T | sample (const Field< Data_T > &data, const V3d &vsP) const |
Definition at line 92 of file FieldInterp.h.
typedef boost::intrusive_ptr<LinearFieldInterp> LinearFieldInterp< Data_T >::Ptr |
Reimplemented from FieldInterp< Data_T >.
Definition at line 95 of file FieldInterp.h.
typedef boost::intrusive_ptr<LinearFieldInterp> LinearFieldInterp< Data_T >::Ptr |
Reimplemented from FieldInterp< Data_T >.
Definition at line 95 of file FieldInterp.h.
Data_T LinearFieldInterp< Data_T >::sample | ( | const Field< Data_T > & | data, |
const V3d & | vsP | ||
) | const [virtual] |
Implements FieldInterp< Data_T >.
Definition at line 283 of file FieldInterp.h.
References FieldRes::dataWindow(), and Field< Data_T >::value().
Referenced by main().
{ // 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)))); }
virtual Data_T LinearFieldInterp< Data_T >::sample | ( | const Field< Data_T > & | data, |
const V3d & | vsP | ||
) | const [virtual] |
Implements FieldInterp< Data_T >.