Field3D
|
#include <FieldInterp.h>
Public Types | |
typedef boost::intrusive_ptr < CubicMACFieldInterp > | Ptr |
typedef boost::intrusive_ptr < CubicMACFieldInterp > | Ptr |
Public Member Functions | |
Data_T | sample (const MACField< Data_T > &data, const V3d &vsP) const |
Data_T | sample (const MACField< Data_T > &data, const V3d &vsP) const |
Definition at line 189 of file FieldInterp.h.
typedef boost::intrusive_ptr<CubicMACFieldInterp> CubicMACFieldInterp< Data_T >::Ptr |
Reimplemented from RefBase.
Definition at line 192 of file FieldInterp.h.
typedef boost::intrusive_ptr<CubicMACFieldInterp> CubicMACFieldInterp< Data_T >::Ptr |
Reimplemented from RefBase.
Definition at line 192 of file FieldInterp.h.
Data_T CubicMACFieldInterp< Data_T >::sample | ( | const MACField< Data_T > & | data, |
const V3d & | vsP | ||
) | const |
Definition at line 741 of file FieldInterp.h.
References FieldRes::dataWindow(), monotonicCubicInterpolant(), MACField< Data_T >::u(), MACField< Data_T >::v(), and MACField< Data_T >::w().
{ typedef typename Data_T::BaseType T; const Box3i &dataWindow = data.dataWindow(); // Pixel centers are at .5 coordinates // NOTE: Don't use contToDisc for this, we're looking for sample // point locations, not coordinate shifts. Data_T ret; // X component --- V3d clampedVsP(std::max(0.5, vsP.x), std::max(0.5, vsP.y), std::max(0.5, vsP.z)); FIELD3D_VEC3_T<double> p(vsP.x, clampedVsP.y - 0.5, clampedVsP.z - 0.5); // Lower left corner V3i c(static_cast<int>(floor(p.x)), static_cast<int>(floor(p.y)), static_cast<int>(floor(p.z))); FIELD3D_VEC3_T<double> t(p - static_cast<FIELD3D_VEC3_T<double> >(c)); { // Clamp the coordinates int im, jm, km; im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x + 1)); jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y)); km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z)); int im_1, jm_1, km_1; im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x + 1)); jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y)); km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z)); int im1, jm1, km1; im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x + 1)); jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y)); km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z)); int im2, jm2, km2; im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x + 1)); jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y)); km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z)); T z11 = monotonicCubicInterpolant(data.u(im_1, jm_1, km_1), data.u(im_1, jm_1, km), data.u(im_1, jm_1, km1), data.u(im_1, jm_1, km2), t.z); T z12 = monotonicCubicInterpolant(data.u(im_1, jm, km_1), data.u(im_1, jm, km), data.u(im_1, jm, km1), data.u(im_1, jm, km2), t.z); T z13 = monotonicCubicInterpolant(data.u(im_1, jm1, km_1), data.u(im_1, jm1, km), data.u(im_1, jm1, km1), data.u(im_1, jm1, km2), t.z); T z14 = monotonicCubicInterpolant(data.u(im_1, jm2, km_1), data.u(im_1, jm2, km), data.u(im_1, jm2, km1), data.u(im_1, jm2, km2), t.z); T z21 = monotonicCubicInterpolant(data.u(im, jm_1, km_1), data.u(im, jm_1, km), data.u(im, jm_1, km1), data.u(im, jm_1, km2), t.z); T z22 = monotonicCubicInterpolant(data.u(im, jm, km_1), data.u(im, jm, km), data.u(im, jm, km1), data.u(im, jm, km2), t.z); T z23 = monotonicCubicInterpolant(data.u(im, jm1, km_1), data.u(im, jm1, km), data.u(im, jm1, km1), data.u(im, jm1, km2), t.z); T z24 = monotonicCubicInterpolant(data.u(im, jm2, km_1), data.u(im, jm2, km), data.u(im, jm2, km1), data.u(im, jm2, km2), t.z); T z31 = monotonicCubicInterpolant(data.u(im1, jm_1, km_1), data.u(im1, jm_1, km), data.u(im1, jm_1, km1), data.u(im1, jm_1, km2), t.z); T z32 = monotonicCubicInterpolant(data.u(im1, jm, km_1), data.u(im1, jm, km), data.u(im1, jm, km1), data.u(im1, jm, km2), t.z); T z33 = monotonicCubicInterpolant(data.u(im1, jm1, km_1), data.u(im1, jm1, km), data.u(im1, jm1, km1), data.u(im1, jm1, km2), t.z); T z34 = monotonicCubicInterpolant(data.u(im1, jm2, km_1), data.u(im1, jm2, km), data.u(im1, jm2, km1), data.u(im1, jm2, km2), t.z); T z41 = monotonicCubicInterpolant(data.u(im2, jm_1, km_1), data.u(im2, jm_1, km), data.u(im2, jm_1, km1), data.u(im2, jm_1, km2), t.z); T z42 = monotonicCubicInterpolant(data.u(im2, jm, km_1), data.u(im2, jm, km), data.u(im2, jm, km1), data.u(im2, jm, km2), t.z); T z43 = monotonicCubicInterpolant(data.u(im2, jm1, km_1), data.u(im2, jm1, km), data.u(im2, jm1, km1), data.u(im2, jm1, km2), t.z); T z44 = monotonicCubicInterpolant(data.u(im2, jm2, km_1), data.u(im2, jm2, km), data.u(im2, jm2, km1), data.u(im2, jm2, km2), t.z); T y1 = monotonicCubicInterpolant(z11, z12, z13, z14, t.y); T y2 = monotonicCubicInterpolant(z21, z22, z23, z24, t.y); T y3 = monotonicCubicInterpolant(z31, z32, z33, z34, t.y); T y4 = monotonicCubicInterpolant(z41, z42, z43, z44, t.y); ret.x = monotonicCubicInterpolant(y1, y2, y3, y4, t.x); } // Y component --- p.setValue(clampedVsP.x - 0.5, vsP.y , clampedVsP.z - 0.5); // Lower left corner c.x = static_cast<int>(floor(p.x)); c.y = static_cast<int>(floor(p.y)); c.z = static_cast<int>(floor(p.z)); t.setValue(p - static_cast<FIELD3D_VEC3_T<double> >(c)); { // Clamp the coordinates int im, jm, km; im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x)); jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y + 1)); km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z)); int im_1, jm_1, km_1; im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x)); jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y + 1)); km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z)); int im1, jm1, km1; im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x)); jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y + 1)); km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z)); int im2, jm2, km2; im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x)); jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y + 1)); km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z)); T z11 = monotonicCubicInterpolant(data.v(im_1, jm_1, km_1), data.v(im_1, jm_1, km), data.v(im_1, jm_1, km1), data.v(im_1, jm_1, km2), t.z); T z12 = monotonicCubicInterpolant(data.v(im_1, jm, km_1), data.v(im_1, jm, km), data.v(im_1, jm, km1), data.v(im_1, jm, km2), t.z); T z13 = monotonicCubicInterpolant(data.v(im_1, jm1, km_1), data.v(im_1, jm1, km), data.v(im_1, jm1, km1), data.v(im_1, jm1, km2), t.z); T z14 = monotonicCubicInterpolant(data.v(im_1, jm2, km_1), data.v(im_1, jm2, km), data.v(im_1, jm2, km1), data.v(im_1, jm2, km2), t.z); T z21 = monotonicCubicInterpolant(data.v(im, jm_1, km_1), data.v(im, jm_1, km), data.v(im, jm_1, km1), data.v(im, jm_1, km2), t.z); T z22 = monotonicCubicInterpolant(data.v(im, jm, km_1), data.v(im, jm, km), data.v(im, jm, km1), data.v(im, jm, km2), t.z); T z23 = monotonicCubicInterpolant(data.v(im, jm1, km_1), data.v(im, jm1, km), data.v(im, jm1, km1), data.v(im, jm1, km2), t.z); T z24 = monotonicCubicInterpolant(data.v(im, jm2, km_1), data.v(im, jm2, km), data.v(im, jm2, km1), data.v(im, jm2, km2), t.z); T z31 = monotonicCubicInterpolant(data.v(im1, jm_1, km_1), data.v(im1, jm_1, km), data.v(im1, jm_1, km1), data.v(im1, jm_1, km2), t.z); T z32 = monotonicCubicInterpolant(data.v(im1, jm, km_1), data.v(im1, jm, km), data.v(im1, jm, km1), data.v(im1, jm, km2), t.z); T z33 = monotonicCubicInterpolant(data.v(im1, jm1, km_1), data.v(im1, jm1, km), data.v(im1, jm1, km1), data.v(im1, jm1, km2), t.z); T z34 = monotonicCubicInterpolant(data.v(im1, jm2, km_1), data.v(im1, jm2, km), data.v(im1, jm2, km1), data.v(im1, jm2, km2), t.z); T z41 = monotonicCubicInterpolant(data.v(im2, jm_1, km_1), data.v(im2, jm_1, km), data.v(im2, jm_1, km1), data.v(im2, jm_1, km2), t.z); T z42 = monotonicCubicInterpolant(data.v(im2, jm, km_1), data.v(im2, jm, km), data.v(im2, jm, km1), data.v(im2, jm, km2), t.z); T z43 = monotonicCubicInterpolant(data.v(im2, jm1, km_1), data.v(im2, jm1, km), data.v(im2, jm1, km1), data.v(im2, jm1, km2), t.z); T z44 = monotonicCubicInterpolant(data.v(im2, jm2, km_1), data.v(im2, jm2, km), data.v(im2, jm2, km1), data.v(im2, jm2, km2), t.z); T y1 = monotonicCubicInterpolant(z11, z12, z13, z14, t.y); T y2 = monotonicCubicInterpolant(z21, z22, z23, z24, t.y); T y3 = monotonicCubicInterpolant(z31, z32, z33, z34, t.y); T y4 = monotonicCubicInterpolant(z41, z42, z43, z44, t.y); ret.y = monotonicCubicInterpolant(y1, y2, y3, y4, t.x); } // Z component --- p.setValue(clampedVsP.x - 0.5 , clampedVsP.y - 0.5, vsP.z); // Lower left corner c.x = static_cast<int>(floor(p.x)); c.y = static_cast<int>(floor(p.y)); c.z = static_cast<int>(floor(p.z)); t.setValue(p - static_cast<FIELD3D_VEC3_T<double> >(c)); { // Clamp the coordinates int im, jm, km; im = std::max(dataWindow.min.x, std::min(c.x, dataWindow.max.x)); jm = std::max(dataWindow.min.y, std::min(c.y, dataWindow.max.y)); km = std::max(dataWindow.min.z, std::min(c.z, dataWindow.max.z + 1)); int im_1, jm_1, km_1; im_1 = std::max(dataWindow.min.x, std::min(im - 1, dataWindow.max.x)); jm_1 = std::max(dataWindow.min.y, std::min(jm - 1, dataWindow.max.y)); km_1 = std::max(dataWindow.min.z, std::min(km - 1, dataWindow.max.z + 1)); int im1, jm1, km1; im1 = std::max(dataWindow.min.x, std::min(im + 1, dataWindow.max.x)); jm1 = std::max(dataWindow.min.y, std::min(jm + 1, dataWindow.max.y)); km1 = std::max(dataWindow.min.z, std::min(km + 1, dataWindow.max.z + 1)); int im2, jm2, km2; im2 = std::max(dataWindow.min.x, std::min(im + 2, dataWindow.max.x)); jm2 = std::max(dataWindow.min.y, std::min(jm + 2, dataWindow.max.y)); km2 = std::max(dataWindow.min.z, std::min(km + 2, dataWindow.max.z + 1)); T z11 = monotonicCubicInterpolant(data.w(im_1, jm_1, km_1), data.w(im_1, jm_1, km), data.w(im_1, jm_1, km1), data.w(im_1, jm_1, km2), t.z); T z12 = monotonicCubicInterpolant(data.w(im_1, jm, km_1), data.w(im_1, jm, km), data.w(im_1, jm, km1), data.w(im_1, jm, km2), t.z); T z13 = monotonicCubicInterpolant(data.w(im_1, jm1, km_1), data.w(im_1, jm1, km), data.w(im_1, jm1, km1), data.w(im_1, jm1, km2), t.z); T z14 = monotonicCubicInterpolant(data.w(im_1, jm2, km_1), data.w(im_1, jm2, km), data.w(im_1, jm2, km1), data.w(im_1, jm2, km2), t.z); T z21 = monotonicCubicInterpolant(data.w(im, jm_1, km_1), data.w(im, jm_1, km), data.w(im, jm_1, km1), data.w(im, jm_1, km2), t.z); T z22 = monotonicCubicInterpolant(data.w(im, jm, km_1), data.w(im, jm, km), data.w(im, jm, km1), data.w(im, jm, km2), t.z); T z23 = monotonicCubicInterpolant(data.w(im, jm1, km_1), data.w(im, jm1, km), data.w(im, jm1, km1), data.w(im, jm1, km2), t.z); T z24 = monotonicCubicInterpolant(data.w(im, jm2, km_1), data.w(im, jm2, km), data.w(im, jm2, km1), data.w(im, jm2, km2), t.z); T z31 = monotonicCubicInterpolant(data.w(im1, jm_1, km_1), data.w(im1, jm_1, km), data.w(im1, jm_1, km1), data.w(im1, jm_1, km2), t.z); T z32 = monotonicCubicInterpolant(data.w(im1, jm, km_1), data.w(im1, jm, km), data.w(im1, jm, km1), data.w(im1, jm, km2), t.z); T z33 = monotonicCubicInterpolant(data.w(im1, jm1, km_1), data.w(im1, jm1, km), data.w(im1, jm1, km1), data.w(im1, jm1, km2), t.z); T z34 = monotonicCubicInterpolant(data.w(im1, jm2, km_1), data.w(im1, jm2, km), data.w(im1, jm2, km1), data.w(im1, jm2, km2), t.z); T z41 = monotonicCubicInterpolant(data.w(im2, jm_1, km_1), data.w(im2, jm_1, km), data.w(im2, jm_1, km1), data.w(im2, jm_1, km2), t.z); T z42 = monotonicCubicInterpolant(data.w(im2, jm, km_1), data.w(im2, jm, km), data.w(im2, jm, km1), data.w(im2, jm, km2), t.z); T z43 = monotonicCubicInterpolant(data.w(im2, jm1, km_1), data.w(im2, jm1, km), data.w(im2, jm1, km1), data.w(im2, jm1, km2), t.z); T z44 = monotonicCubicInterpolant(data.w(im2, jm2, km_1), data.w(im2, jm2, km), data.w(im2, jm2, km1), data.w(im2, jm2, km2), t.z); T y1 = monotonicCubicInterpolant(z11, z12, z13, z14, t.y); T y2 = monotonicCubicInterpolant(z21, z22, z23, z24, t.y); T y3 = monotonicCubicInterpolant(z31, z32, z33, z34, t.y); T y4 = monotonicCubicInterpolant(z41, z42, z43, z44, t.y); ret.z = monotonicCubicInterpolant(y1, y2, y3, y4, t.x); } return ret; }
Data_T CubicMACFieldInterp< Data_T >::sample | ( | const MACField< Data_T > & | data, |
const V3d & | vsP | ||
) | const |