47 virtual void set(
const T*) = 0;
48 virtual T apply(
float x,
float y)
const = 0;
65 inline void set(
const T*);
66 inline void set(T v00,T v01,T v10,T v11);
67 inline T apply(
float x,
float y)
const;
76 inline T
linearReg2D( T v00, T v01, T v10, T v11,
float x,
float y )
93 inline void set(
const T*);
94 inline void set(T v00,T v01,T v10,T v11);
95 inline T apply(
float x,
float y)
const;
129 inline PolyReg2D(
const T*,
float xstretch=1);
131 T v0m1,T v00, T v01,T v02,
132 T v1m1,T v10, T v11,T v12,
133 T v20, T v21,
float xstretch=1);
135 inline void set(
const T*);
136 inline void set( T vm10,T vm11,
137 T v0m1,T v00, T v01, T v02,
138 T v1m1,T v10, T v11, T v12,
141 inline T apply(
float x,
float y)
const;
154 inline T
polyReg2D( T vm10, T vm11, T v0m1, T v00, T v01, T v02,
155 T v1m1, T v10, T v11, T v12, T v20, T v21,
float x,
float y,
158 return PolyReg2D<T>(vm10,vm11,v0m1,v00,v01,v02,v1m1,v10,v11,v12,v20,v21,xs)
179 T v1m1,T v10,T v11,T v12,T v20,T v21,
182 inline void set(
const T*);
183 inline void set( T vm10,T vm11,
184 T v0m1,T v00, T v01, T v02,
185 T v1m1,T v10, T v11, T v12,
188 inline T apply(
float x,
float y)
const;
192 inline void fillOuter2Inner(T,T,T,T,T,T,T,T,T&,T&,T&,T&);
193 inline void fillInner2Inner(T&,T&,T&,T&);
194 inline void fillInner2Outer(T,T,T,T,T&,T&,T&,T&,T&,T&,T&,T&);
216 T v1m1, T v10, T v11, T v12, T v20, T v21,
float x,
float y )
218 return PolyReg2DWithUdf<T>(vm10,vm11,v0m1,v00,v01,v02,v1m1,v10,v11,v12,v20,
224 template <
class T>
inline 228 template <
class T>
inline 231 set( v[0], v[1], v[2], v[3] );
235 template <
class T>
inline 238 set( v00, v01, v10, v11 );
242 template <
class T>
inline 245 set( v[0], v[1], v[2], v[3] );
249 template <
class T>
inline 255 a_[3] = v11 + v00 - v10 - v01;
259 template <
class T>
inline 262 return a_[0] + a_[1] * x + a_[2] * y + a_[3] * x * y;
268 template <
class T>
inline 272 template <
class T>
inline 275 set( v[0], v[1], v[2], v[3] );
279 template <
class T>
inline 282 set( v00, v01, v10, v11 );
286 template <
class T>
inline 289 set( v[0], v[1], v[2], v[3] );
293 #define mFillIfUdfFromSquare(nd,left,right,opp) \ 296 if ( u##left##_ && u##right##_ ) \ 299 v##nd = u##left##_ || u##right##_ ? \ 300 (u##right##_ ? v##left : v##right) \ 301 : (v##left + v##right) / 2; \ 304 template <
class T>
inline 311 haveudf_ = u00_ || u10_ || u01_ || u11_;
321 intp_.set( v00, v01, v10, v11 );
325 #define mRetUdfIfNearestUdf() \ 327 ( u00_ && x < 0.5 && y < 0.5 ) \ 328 || ( u10_ && x >= 0.5 && y < 0.5 ) \ 329 || ( u01_ && x < 0.5 && y >= 0.5 ) \ 330 || ( u11_ && x >= 0.5 && y >= 0.5 ) ) ) \ 335 template <
class T>
inline 340 return intp_.apply( x, y );
347 template <
class T>
inline 353 template <
class T>
inline 361 template <
class T>
inline 363 T v0m1, T v00, T v01, T v02,
364 T v1m1, T v10, T v11, T v12,
365 T v20, T v21,
float xs )
368 set( vm10, vm11, v0m1, v00, v01, v02, v1m1, v10, v11, v12, v20, v21 );
372 template <
class T>
inline 376 set( v[4], v[5], v[6], v[0], v[1], v[7], v[8], v[2], v[3],
377 v[9], v[10], v[11] );
379 set( v[0], v[1], v[0], v[0], v[1], v[1], v[2], v[2], v[3],
384 template <
class T>
inline 386 T v0m1, T v00, T v01, T v02,
387 T v1m1, T v10, T v11, T v12,
393 ix0_.set( v0m1, v00, v01, v02 );
ix1_.set( v1m1, v10, v11, v12 );
394 iy0_.set( vm10, v00, v10, v20 );
iy1_.set( vm11, v01, v11, v21 );
398 template <
class T>
inline 402 if ( x <= 0 )
return ix0_.apply( y );
403 else if ( y <= 0 )
return iy0_.apply( x );
404 else if ( x >= 1 )
return ix1_.apply( y );
405 else if ( y >= 1 )
return iy1_.apply( x );
409 const T vx0 =
ix0_.apply( y );
410 const T vx1 =
ix1_.apply( y );
415 const T vy0 =
iy0_.apply( x );
416 const T vy1 =
iy1_.apply( x );
420 const T estx =
polyReg1D( vxm1, vx0, vx1, vx2, x );
421 const T esty =
polyReg1D( vym1, vy0, vy1, vy2, y );
422 const float distfromedgex = x > 0.5 ? 1 - x : x;
423 const float distfromedgey = y > 0.5 ? 1 - y : y;
425 const float wty = distfromedgex *
xs_;
426 return (distfromedgey * estx + wty * esty) / (distfromedgey + wty);
433 template <
class T>
inline 440 template <
class T>
inline 448 template <
class T>
inline 450 T v1m1,T v10, T v11, T v12, T v20,T v21,
454 set( vm10, vm11, v0m1, v00, v01, v02, v1m1, v10, v11, v12, v20, v21 );
458 template <
class T>
inline 462 set( v[4], v[5], v[6], v[0], v[1], v[7], v[8], v[2], v[3],
463 v[9], v[10], v[11] );
465 set( v[0], v[1], v[0], v[0], v[1], v[1], v[2], v[2], v[3],
470 template <
class T>
inline 472 T v1m1, T v12, T v20, T v21,
473 T& v00, T& v01, T& v10, T& v11 )
475 #define mFillWithEither(nd,cand1,cand2) \ 478 if ( !u##cand1##_ ) v##nd = v##cand1; \ 479 else if ( !u##cand2##_ ) v##nd = v##cand2; \ 487 #undef mFillWithEither 491 template <
class T>
inline 508 template <
class T>
inline 510 T& vm10, T& vm11, T& v0m1, T& v02,
511 T& v1m1, T& v12, T& v20, T& v21 )
513 #define mFillIfUdf(nd,src) if ( mIsUdf(v##nd) ) v##nd= v##src; 526 template <
class T>
inline 528 T v0m1, T v00, T v01, T v02,
529 T v1m1, T v10, T v11, T v12,
552 v00, v01, v10, v11 );
556 vm10, vm11, v0m1, v02, v1m1, v12, v20, v21 );
559 intp_.set( vm10, vm11, v0m1, v00, v01, v02, v1m1, v10, v11, v12, v20, v21 );
562 template <
class T>
inline 567 return intp_.apply( x, y );
571 #undef mFillIfUdfFromSquare 572 #undef mRetUdfIfNearestUdf void fillOuter2Inner(T, T, T, T, T, T, T, T, T &, T &, T &, T &)
Definition: interpol2d.h:471
Definition: interpol1d.h:36
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
void fillInner2Inner(T &, T &, T &, T &)
Definition: interpol2d.h:492
T v0m1_
Definition: interpol2d.h:146
bool u01_
Definition: interpol2d.h:200
PolyReg1D< T > iy1_
Definition: interpol2d.h:145
PolyReg2DWithUdf(float xstretch=1)
Definition: interpol2d.h:434
void fillInner2Outer(T, T, T, T, T &, T &, T &, T &, T &, T &, T &, T &)
Definition: interpol2d.h:509
#define mFillWithEither(nd, cand1, cand2)
bool u20_
Definition: interpol2d.h:208
bool u0m1_
Definition: interpol2d.h:204
T apply(float x, float y) const
Definition: interpol2d.h:563
#define mFillIfUdf(nd, src)
bool um10_
Definition: interpol2d.h:202
Linear 2D interpolation.
Definition: interpol2d.h:57
#define mRetUdfIfNearestUdf()
Definition: interpol2d.h:325
T linearReg2D(T v00, T v01, T v10, T v11, float x, float y)
Definition: interpol2d.h:76
bool u10_
Definition: interpol2d.h:199
Definition: interpol1d.h:90
LinearReg2D()
Definition: interpol2d.h:225
bool u00_
Definition: interpol2d.h:198
T polyReg1D(T vm1, T v0, T v1, T v2, float x)
Definition: interpol1d.h:128
T v02_
Definition: interpol2d.h:146
bool u00_
Definition: interpol2d.h:101
void set(const T *)
Definition: interpol2d.h:459
T delxm1_
Definition: interpol2d.h:147
T linearReg2DWithUdf(T v00, T v01, T v10, T v11, float x, float y)
Definition: interpol2d.h:109
bool u12_
Definition: interpol2d.h:207
#define mFillIfUdfFromSquare(nd, left, right, opp)
Definition: interpol2d.h:293
PolyReg2D(float xstretch=1)
Definition: interpol2d.h:348
T delym1_
Definition: interpol2d.h:147
PolyReg1D< T > ix1_
Definition: interpol2d.h:145
bool um11_
Definition: interpol2d.h:203
void set(const T *)
Definition: interpol2d.h:373
bool haveudf_
Definition: interpol2d.h:197
T apply(float x, float y) const
Definition: interpol2d.h:336
virtual ~Applier2D()
Definition: interpol2d.h:46
void set(const T *)
Definition: interpol2d.h:243
T delx2_
Definition: interpol2d.h:147
void set(const T *)
Definition: interpol2d.h:287
bool u11_
Definition: interpol2d.h:104
T v20_
Definition: interpol2d.h:146
PolyReg2D< T > intp_
Definition: interpol2d.h:196
PolyReg1D< T > iy0_
Definition: interpol2d.h:145
T apply(float x, float y) const
Definition: interpol2d.h:260
bool u11_
Definition: interpol2d.h:201
T polyReg2D(T vm10, T vm11, T v0m1, T v00, T v01, T v02, T v1m1, T v10, T v11, T v12, T v20, T v21, float x, float y, float xs=1)
Definition: interpol2d.h:154
PolyReg1D< T > ix0_
Definition: interpol2d.h:145
bool u01_
Definition: interpol2d.h:103
Linear 2D interpolation with standard undef handling.
Definition: interpol2d.h:85
float xs_
Definition: interpol2d.h:148
bool u1m1_
Definition: interpol2d.h:206
Interpolate 2D regularly sampled, using a 2nd order surface.
Definition: interpol2d.h:124
bool haveudf_
Definition: interpol2d.h:100
bool u21_
Definition: interpol2d.h:209
specification for a 2D interpolator
Definition: interpol2d.h:43
T polyReg2DWithUdf(T vm10, T vm11, T v0m1, T v00, T v01, T v02, T v1m1, T v10, T v11, T v12, T v20, T v21, float x, float y)
Definition: interpol2d.h:215
bool u10_
Definition: interpol2d.h:102
#define mClass(module)
Definition: commondefs.h:161
T vm10_
Definition: interpol2d.h:146
T apply(float x, float y) const
Definition: interpol2d.h:399
T dely2_
Definition: interpol2d.h:147
PolyReg2D which smoothly handles undefined values.
Definition: interpol2d.h:172
LinearReg2D< T > intp_
Definition: interpol2d.h:99
bool u02_
Definition: interpol2d.h:205
LinearReg2DWithUdf()
Definition: interpol2d.h:269