33 set( v[0][0][0], v[1][0][0], v[0][1][0], v[1][1][0],
34 v[0][0][1], v[1][0][1], v[0][1][1], v[1][1][1] );
37 LinearReg3D( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111 )
39 set( v000, v100, v010, v110, v001, v101, v011, v111 );
42 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
48 a_[4] = v110 + v000 - v100 - v010;
49 a_[5] = v101 + v000 - v100 - v001;
50 a_[6] = v011 + v000 - v010 - v001;
51 a_[7] = v111 + v100 + v010 + v001 - (v000 + v110 + v101 + v011);
54 inline T
apply(
float x,
float y,
float z )
const
56 return a_[0] + a_[1] * x + a_[2] * y + a_[3] * z
57 + a_[4] * x * y + a_[5] * x * z + a_[6] * y * z
68 T v001, T v101, T v011, T v111,
69 float x,
float y,
float z )
71 return LinearReg3D<T>( v000, v100, v010, v110, v001, v101, v011, v111 )
89 set( v[0][0][0], v[1][0][0], v[0][1][0], v[1][1][0],
90 v[0][0][1], v[1][0][1], v[0][1][1], v[1][1][1] );
94 T v001, T v101, T v011, T v111 )
96 set( v000, v100, v010, v110, v001, v101, v011, v111 );
99 inline static T
getReplVal( T v1, T v2, T v3,
bool u1,
bool u2,
bool u3 )
103 return u2 ? v3 : (u3 ? v2 : (v2 + v3) / 2);
105 return u3 ? v1 : (v1 + v3) / 2;
107 return (v1 + v2) / 2;
109 return (v1 + v2 + v3) / 3;
112 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111)
122 haveudf_ = u000_ || u100_ || u010_ || u110_
123 || u001_ || u101_ || u011_ || u111_;
127 # define mFillIfUdf(nd,nearx,neary,nearz,diagxy,diagxz,diagyz,opp) \
130 if ( !u##nearx##_ || !u##neary##_ || !u##nearz##_ ) \
131 v##nd = getReplVal( v##nearx, v##neary, v##nearz, \
132 u##nearx##_, u##neary##_, u##nearz##_ ); \
135 if ( u##diagxy##_ && u##diagxz##_ && u##diagyz##_ ) \
138 v##nd = getReplVal( v##diagxy, v##diagxz, v##diagyz, \
139 u##diagxy##_, u##diagxz##_, u##diagyz##_ ); \
155 intp_.set( v000, v100, v010, v110, v001, v101, v011, v111 );
158 inline T
apply(
float x,
float y,
float z )
const
162 ( u000_ && x < 0.5 && y < 0.5 && z < 0.5 )
163 || ( u100_ && x >= 0.5 && y < 0.5 && z < 0.5 )
164 || ( u010_ && x < 0.5 && y >= 0.5 && z < 0.5 )
165 || ( u110_ && x >= 0.5 && y >= 0.5 && z < 0.5 )
166 || ( u001_ && x < 0.5 && y < 0.5 && z >= 0.5 )
167 || ( u101_ && x >= 0.5 && y < 0.5 && z >= 0.5 )
168 || ( u011_ && x < 0.5 && y >= 0.5 && z >= 0.5 )
169 || ( u111_ && x >= 0.5 && y >= 0.5 && z >= 0.5 ) ) )
172 return intp_.apply( x, y, z );
190 T v001, T v101, T v011, T v111,
191 float x,
float y,
float z )
226 set( v[0][1][1], v[0][1][2], v[0][2][1], v[0][2][2],
227 v[1][0][1], v[1][0][2], v[1][1][0], v[1][1][1],
228 v[1][1][2], v[1][1][3], v[1][2][0], v[1][2][1],
229 v[1][2][2], v[1][2][3], v[1][3][1], v[1][3][2],
230 v[2][0][1], v[2][0][2], v[2][1][0], v[2][1][1],
231 v[2][1][2], v[2][1][3], v[2][2][0], v[2][2][1],
232 v[2][2][2], v[2][2][3], v[2][3][1], v[2][3][2],
233 v[3][1][1], v[3][1][2], v[3][2][1], v[3][2][2] );
237 T vm100, T vm101, T vm110, T vm111,
238 T v0m10, T v0m11, T v00m1, T v000,
239 T v001, T v002, T v01m1, T v010,
240 T v011, T v012, T v020, T v021,
241 T v1m10, T v1m11, T v10m1, T v100,
242 T v101, T v102, T v11m1, T v110,
243 T v111, T v112, T v120, T v121,
244 T v200, T v201, T v210, T v211 )
246 set( vm100, vm101, vm110, vm111,
247 v0m10, v0m11, v00m1, v000,
248 v001, v002, v01m1, v010,
249 v011, v012, v020, v021,
250 v1m10, v1m11, v10m1, v100,
251 v101, v102, v11m1, v110,
252 v111, v112, v120, v121,
253 v200, v201, v210, v211 );
257 T vm100, T vm101, T vm110, T vm111,
258 T v0m10, T v0m11, T v00m1, T v000,
259 T v001, T v002, T v01m1, T v010,
260 T v011, T v012, T v020, T v021,
261 T v1m10, T v1m11, T v10m1, T v100,
262 T v101, T v102, T v11m1, T v110,
263 T v111, T v112, T v120, T v121,
264 T v200, T v201, T v210, T v211 )
266 set( v000, v100, v010, v110, v001, v101, v011, v111,
267 (v00m1 + v01m1 + v10m1 + v11m1) / 4,
268 (v0m10 + v0m11 + v1m10 + v1m11) / 4,
269 (vm100 + vm101 + vm110 + vm111) / 4,
270 (v002 + v012 + v102 + v112) / 4,
271 (v020 + v021 + v120 + v121) / 4,
272 (v200 + v201 + v210 + v211) / 4 );
275 inline void set( T v000, T v100, T v010, T v110, T v001, T v101, T v011, T v111,
276 T vxym1, T vxzm1, T vyzm1, T vxy1, T vxz1, T vyz1 )
281 inline T
apply(
float x,
float y,
float z )
const
283 return a_[0] + a_[1] * x + a_[2] * y + a_[3] * z
284 + a_[4] * x * y + a_[5] * x * z + a_[6] * y * z
286 + a_[8] * x * x * y + a_[9] * x * x * z
287 + a_[10] * y * y * x + a_[11] * y * y * z
288 + a_[12] * z * z * x + a_[13] * z * z * y;
297 inline T
polyReg3D(
const T*
const*
const * v,
float x,
float y,
float z )