48 virtual void set(
const T*) = 0;
49 virtual T
apply(
float x,
float y)
const = 0;
66 inline void set(
const T*);
67 inline void set(T v00,T v01,T v10,T v11);
68 inline T apply(
float x,
float y)
const;
77 inline T
linearReg2D( T v00, T v01, T v10, T v11,
float x,
float y )
94 inline void set(
const T*);
95 inline void set(T v00,T v01,T v10,T v11);
96 inline T apply(
float x,
float y)
const;
130 inline PolyReg2D(
const T*,
float xstretch=1);
132 T v0m1,T v00, T v01,T v02,
133 T v1m1,T v10, T v11,T v12,
134 T v20, T v21,
float xstretch=1);
136 inline void set(
const T*);
137 inline void set( T vm10,T vm11,
138 T v0m1,T v00, T v01, T v02,
139 T v1m1,T v10, T v11, T v12,
142 inline T apply(
float x,
float y)
const;
155 inline T
polyReg2D( T vm10, T vm11, T v0m1, T v00, T v01, T v02,
156 T v1m1, T v10, T v11, T v12, T v20, T v21,
float x,
float y,
159 return PolyReg2D<T>(vm10,vm11,v0m1,v00,v01,v02,v1m1,v10,v11,v12,v20,v21,xs)
180 T v1m1,T v10,T v11,T v12,T v20,T v21,
183 inline void set(
const T*);
184 inline void set( T vm10,T vm11,
185 T v0m1,T v00, T v01, T v02,
186 T v1m1,T v10, T v11, T v12,
189 inline T apply(
float x,
float y)
const;
193 inline void fillOuter2Inner(T,T,T,T,T,T,T,T,T&,T&,T&,T&);
194 inline void fillInner2Inner(T&,T&,T&,T&);
195 inline void fillInner2Outer(T,T,T,T,T&,T&,T&,T&,T&,T&,T&,T&);
217 T v1m1, T v10, T v11, T v12, T v20, T v21,
float x,
float y )
219 return PolyReg2DWithUdf<T>(vm10,vm11,v0m1,v00,v01,v02,v1m1,v10,v11,v12,v20,
225 template <
class T>
inline
229 template <
class T>
inline
232 set( v[0], v[1], v[2], v[3] );
236 template <
class T>
inline
239 set( v00, v01, v10, v11 );
243 template <
class T>
inline
246 set( v[0], v[1], v[2], v[3] );
250 template <
class T>
inline
256 a_[3] = v11 + v00 - v10 - v01;
260 template <
class T>
inline
263 return a_[0] + a_[1] * x + a_[2] * y + a_[3] * x * y;
269 template <
class T>
inline
273 template <
class T>
inline
276 set( v[0], v[1], v[2], v[3] );
280 template <
class T>
inline
283 set( v00, v01, v10, v11 );
287 template <
class T>
inline
290 set( v[0], v[1], v[2], v[3] );
294 #define mFillIfUdfFromSquare(nd,left,right,opp) \
297 if ( u##left##_ && u##right##_ ) \
300 v##nd = u##left##_ || u##right##_ ? \
301 (u##right##_ ? v##left : v##right) \
302 : (v##left + v##right) / 2; \
305 template <
class T>
inline
312 haveudf_ = u00_ || u10_ || u01_ || u11_;
322 intp_.set( v00, v01, v10, v11 );
326 #define mRetUdfIfNearestUdf() \
328 ( u00_ && x < 0.5 && y < 0.5 ) \
329 || ( u10_ && x >= 0.5 && y < 0.5 ) \
330 || ( u01_ && x < 0.5 && y >= 0.5 ) \
331 || ( u11_ && x >= 0.5 && y >= 0.5 ) ) ) \
336 template <
class T>
inline
341 return intp_.apply( x, y );
348 template <
class T>
inline
354 template <
class T>
inline
362 template <
class T>
inline
364 T v0m1, T v00, T v01, T v02,
365 T v1m1, T v10, T v11, T v12,
366 T v20, T v21,
float xs )
369 set( vm10, vm11, v0m1, v00, v01, v02, v1m1, v10, v11, v12, v20, v21 );
373 template <
class T>
inline
377 set( v[4], v[5], v[6], v[0], v[1], v[7], v[8], v[2], v[3],
378 v[9], v[10], v[11] );
380 set( v[0], v[1], v[0], v[0], v[1], v[1], v[2], v[2], v[3],
385 template <
class T>
inline
387 T v0m1, T v00, T v01, T v02,
388 T v1m1, T v10, T v11, T v12,
391 vm10_ = vm10; v0m1_ = v0m1; v20_ = v20; v02_ = v02;
392 delxm1_ = vm11 - vm10; delym1_ = v1m1 - v0m1;
393 delx2_ = v21 - v20; dely2_ = v12 - v02;
394 ix0_.set( v0m1, v00, v01, v02 ); ix1_.set( v1m1, v10, v11, v12 );
395 iy0_.set( vm10, v00, v10, v20 ); iy1_.set( vm11, v01, v11, v21 );
399 template <
class T>
inline
403 if ( x <= 0 )
return ix0_.apply( y );
404 else if ( y <= 0 )
return iy0_.apply( x );
405 else if ( x >= 1 )
return ix1_.apply( y );
406 else if ( y >= 1 )
return iy1_.apply( x );
409 const T vxm1 = vm10_ + delxm1_ * y;
410 const T vx0 = ix0_.apply( y );
411 const T vx1 = ix1_.apply( y );
412 const T vx2 = v20_ + delx2_ * y;
415 const T vym1 = v0m1_ + delym1_ * x;
416 const T vy0 = iy0_.apply( x );
417 const T vy1 = iy1_.apply( x );
418 const T vy2 = v02_ + dely2_ * x;
421 const T estx =
polyReg1D( vxm1, vx0, vx1, vx2, x );
422 const T esty =
polyReg1D( vym1, vy0, vy1, vy2, y );
423 const float distfromedgex = x > 0.5 ? 1 - x : x;
424 const float distfromedgey = y > 0.5 ? 1 - y : y;
426 const float wty = distfromedgex * xs_;
427 return (distfromedgey * estx + wty * esty) / (distfromedgey + wty);
434 template <
class T>
inline
441 template <
class T>
inline
449 template <
class T>
inline
451 T v1m1,T v10, T v11, T v12, T v20,T v21,
455 set( vm10, vm11, v0m1, v00, v01, v02, v1m1, v10, v11, v12, v20, v21 );
459 template <
class T>
inline
463 set( v[4], v[5], v[6], v[0], v[1], v[7], v[8], v[2], v[3],
464 v[9], v[10], v[11] );
466 set( v[0], v[1], v[0], v[0], v[1], v[1], v[2], v[2], v[3],
471 template <
class T>
inline
473 T v1m1, T v12, T v20, T v21,
474 T& v00, T& v01, T& v10, T& v11 )
476 #define mFillWithEither(nd,cand1,cand2) \
479 if ( !u##cand1##_ ) v##nd = v##cand1; \
480 else if ( !u##cand2##_ ) v##nd = v##cand2; \
488 #undef mFillWithEither
492 template <
class T>
inline
495 bool kpu00 = u00_, kpu10 = u10_, kpu01 = u01_, kpu11 = u11_;
498 if ( u00_ || u10_ || u01_ || u11_ )
505 u00_ = kpu00; u10_ = kpu10; u01_ = kpu01; u11_ = kpu11;
509 template <
class T>
inline
511 T& vm10, T& vm11, T& v0m1, T& v02,
512 T& v1m1, T& v12, T& v20, T& v21 )
514 #define mFillIfUdf(nd,src) if ( mIsUdf(v##nd) ) v##nd= v##src;
527 template <
class T>
inline
529 T v0m1, T v00, T v01, T v02,
530 T v1m1, T v10, T v11, T v12,
545 haveudf_ = u00_ || u10_ || u01_ || u11_;
547 if ( haveudf_ || u02_ || u12_ || u20_ || u21_
548 || um10_ || um11_ || u0m1_ || u1m1_ )
552 fillOuter2Inner( vm10, vm11, v0m1, v02, v1m1, v12, v20, v21,
553 v00, v01, v10, v11 );
554 fillInner2Inner( v00, v01, v10, v11 );
556 fillInner2Outer( v00, v01, v10, v11,
557 vm10, vm11, v0m1, v02, v1m1, v12, v20, v21 );
560 intp_.set( vm10, vm11, v0m1, v00, v01, v02, v1m1, v10, v11, v12, v20, v21 );
563 template <
class T>
inline
568 return intp_.apply( x, y );
572 #undef mFillIfUdfFromSquare
573 #undef mRetUdfIfNearestUdf