32 set( v[0][0][0], v[1][0][0], v[0][1][0], v[1][1][0],
33 v[0][0][1], v[1][0][1], v[0][1][1], v[1][1][1] );
36 LinearReg3D( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111 )
38 set( v000, v100, v010, v110, v001, v101, v011, v111 );
41 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
47 a_[4] = v110 + v000 - v100 - v010;
48 a_[5] = v101 + v000 - v100 - v001;
49 a_[6] = v011 + v000 - v010 - v001;
50 a_[7] = v111 + v100 + v010 + v001 - (v000 + v110 + v101 + v011);
53 inline T
apply(
float x,
float y,
float z )
const 55 return a_[0] + a_[1] * x + a_[2] * y + a_[3] * z
56 + a_[4] * x * y + a_[5] * x * z + a_[6] * y * z
67 T v001, T v101, T v011, T v111,
68 float x,
float y,
float z )
70 return LinearReg3D<T>( v000, v100, v010, v110, v001, v101, v011, v111 )
88 set( v[0][0][0], v[1][0][0], v[0][1][0], v[1][1][0],
89 v[0][0][1], v[1][0][1], v[0][1][1], v[1][1][1] );
93 T v001, T v101, T v011, T v111 )
95 set( v000, v100, v010, v110, v001, v101, v011, v111 );
98 inline static T
getReplVal( T v1, T v2, T v3,
bool u1,
bool u2,
bool u3 )
102 return u2 ? v3 : (u3 ? v2 : (v2 + v3) / 2);
104 return u3 ? v1 : (v1 + v3) / 2;
106 return (v1 + v2) / 2;
108 return (v1 + v2 + v3) / 3;
111 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
121 haveudf_ = u000_ || u100_ || u010_ || u110_
122 || u001_ || u101_ || u011_ || u111_;
126 # define mFillIfUdf(nd,nearx,neary,nearz,diagxy,diagxz,diagyz,opp) \ 129 if ( !u##nearx##_ || !u##neary##_ || !u##nearz##_ ) \ 130 v##nd = getReplVal( v##nearx, v##neary, v##nearz, \ 131 u##nearx##_, u##neary##_, u##nearz##_ ); \ 134 if ( u##diagxy##_ && u##diagxz##_ && u##diagyz##_ ) \ 137 v##nd = getReplVal( v##diagxy, v##diagxz, v##diagyz, \ 138 u##diagxy##_, u##diagxz##_, u##diagyz##_ ); \ 154 intp_.set( v000, v100, v010, v110, v001, v101, v011, v111 );
157 inline T
apply(
float x,
float y,
float z )
const 161 ( u000_ && x < 0.5 && y < 0.5 && z < 0.5 )
162 || ( u100_ && x >= 0.5 && y < 0.5 && z < 0.5 )
163 || ( u010_ && x < 0.5 && y >= 0.5 && z < 0.5 )
164 || ( u110_ && x >= 0.5 && y >= 0.5 && z < 0.5 )
165 || ( u001_ && x < 0.5 && y < 0.5 && z >= 0.5 )
166 || ( u101_ && x >= 0.5 && y < 0.5 && z >= 0.5 )
167 || ( u011_ && x < 0.5 && y >= 0.5 && z >= 0.5 )
168 || ( u111_ && x >= 0.5 && y >= 0.5 && z >= 0.5 ) ) )
171 return intp_.apply( x, y, z );
189 T v001, T v101, T v011, T v111,
190 float x,
float y,
float z )
225 set( v[0][1][1], v[0][1][2], v[0][2][1], v[0][2][2],
226 v[1][0][1], v[1][0][2], v[1][1][0], v[1][1][1],
227 v[1][1][2], v[1][1][3], v[1][2][0], v[1][2][1],
228 v[1][2][2], v[1][2][3], v[1][3][1], v[1][3][2],
229 v[2][0][1], v[2][0][2], v[2][1][0], v[2][1][1],
230 v[2][1][2], v[2][1][3], v[2][2][0], v[2][2][1],
231 v[2][2][2], v[2][2][3], v[2][3][1], v[2][3][2],
232 v[3][1][1], v[3][1][2], v[3][2][1], v[3][2][2] );
236 T vm100, T vm101, T vm110, T vm111,
237 T v0m10, T v0m11, T v00m1, T v000,
238 T v001, T v002, T v01m1, T v010,
239 T v011, T v012, T v020, T v021,
240 T v1m10, T v1m11, T v10m1, T v100,
241 T v101, T v102, T v11m1, T v110,
242 T v111, T v112, T v120, T v121,
243 T v200, T v201, T v210, T v211 )
245 set( vm100, vm101, vm110, vm111,
246 v0m10, v0m11, v00m1, v000,
247 v001, v002, v01m1, v010,
248 v011, v012, v020, v021,
249 v1m10, v1m11, v10m1, v100,
250 v101, v102, v11m1, v110,
251 v111, v112, v120, v121,
252 v200, v201, v210, v211 );
256 T vm100, T vm101, T vm110, T vm111,
257 T v0m10, T v0m11, T v00m1, T v000,
258 T v001, T v002, T v01m1, T v010,
259 T v011, T v012, T v020, T v021,
260 T v1m10, T v1m11, T v10m1, T v100,
261 T v101, T v102, T v11m1, T v110,
262 T v111, T v112, T v120, T v121,
263 T v200, T v201, T v210, T v211 )
265 set( v000, v100, v010, v110, v001, v101, v011, v111,
266 (v00m1 + v01m1 + v10m1 + v11m1) / 4,
267 (v0m10 + v0m11 + v1m10 + v1m11) / 4,
268 (vm100 + vm101 + vm110 + vm111) / 4,
269 (v002 + v012 + v102 + v112) / 4,
270 (v020 + v021 + v120 + v121) / 4,
271 (v200 + v201 + v210 + v211) / 4 );
274 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111,
275 T vxym1, T vxzm1, T vyzm1, T vxy1, T vxz1, T vyz1 )
280 inline T
apply(
float x,
float y,
float z )
const 282 return a_[0] + a_[1] * x + a_[2] * y + a_[3] * z
283 + a_[4] * x * y + a_[5] * x * z + a_[6] * y * z
285 + a_[8] * x * x * y + a_[9] * x * x * z
286 + a_[10] * y * y * x + a_[11] * y * y * z
287 + a_[12] * z * z * x + a_[13] * z * z * y;
296 inline T
polyReg3D(
const T*
const*
const * v,
float x,
float y,
float z )
Definition: interpol1d.h:36
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
bool u110_
Definition: interpol3d.h:179
T apply(float x, float y, float z) const
Definition: interpol3d.h:157
LinearReg3D()
Definition: interpol3d.h:28
LinearReg3DWithUdf(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
Definition: interpol3d.h:92
bool u101_
Definition: interpol3d.h:181
bool u000_
Definition: interpol3d.h:176
Interpolate 3D regularly sampled, using a 3rd order surface.
Definition: interpol3d.h:217
static T getReplVal(T v1, T v2, T v3, bool u1, bool u2, bool u3)
Definition: interpol3d.h:98
PolyReg3D(T vm100, T vm101, T vm110, T vm111, T v0m10, T v0m11, T v00m1, T v000, T v001, T v002, T v01m1, T v010, T v011, T v012, T v020, T v021, T v1m10, T v1m11, T v10m1, T v100, T v101, T v102, T v11m1, T v110, T v111, T v112, T v120, T v121, T v200, T v201, T v210, T v211)
Definition: interpol3d.h:235
LinearReg3DWithUdf()
Definition: interpol3d.h:84
bool u010_
Definition: interpol3d.h:178
LinearReg3D< T > intp_
Definition: interpol3d.h:174
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
T linearReg3DWithUdf(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111, float x, float y, float z)
Definition: interpol3d.h:188
PolyReg3D(const T *const *const *v)
Definition: interpol3d.h:223
T apply(float x, float y, float z) const
Definition: interpol3d.h:53
bool haveudf_
Definition: interpol3d.h:175
#define mFillIfUdf(nd, nearx, neary, nearz, diagxy, diagxz, diagyz, opp)
LinearReg3DWithUdf(const T *const *const *v)
Definition: interpol3d.h:86
bool u111_
Definition: interpol3d.h:183
LinearReg3D(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
Definition: interpol3d.h:36
Linear 3D interpolation.
Definition: interpol3d.h:24
Linear 3D interpolation with standard undef handling.
Definition: interpol3d.h:80
bool u100_
Definition: interpol3d.h:177
PolyReg3D()
Definition: interpol3d.h:221
T polyReg3D(const T *const *const *v, float x, float y, float z)
PolyReg3D which smoothly handles undefined values.
Definition: interpol3d.h:296
bool u011_
Definition: interpol3d.h:182
T apply(float x, float y, float z) const
Definition: interpol3d.h:280
T linearReg3D(T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111, float x, float y, float z)
Definition: interpol3d.h:66
#define mClass(module)
Definition: commondefs.h:161
bool u001_
Definition: interpol3d.h:180
LinearReg3D(const T *const *const *v)
Definition: interpol3d.h:30