46 return x * v1 + (1-x) * v0;
58 return x < 0.5 ?
mUdf(T) : v1;
60 return x >= 0.5 ?
mUdf(T) : v0;
72 inline T
linear1D(
float x0, T v0,
float x1, T v1,
float x )
74 return v0 + (x-x0) * (v1-v0) / (x1-x0);
79 inline iT
linear1Di(
float x0, iT v0,
float x1, iT v1,
float x )
81 const float tmp = v0 + (x-x0) * (v1-v0) / (x1-x0);
101 set( v[0], v[1], v[2], v[3] );
106 set( vm1, v0, v1, v2 );
109 inline void set( T vm1, T v0, T v1, T v2 )
112 a_[1] = v1 - (( 2*vm1 + 3*v0 + v2 ) / 6);
113 a_[2] = (( v1 + vm1 ) / 2) - v0;
114 a_[3] = (( v1 - vm1 ) / 2) - a_[1];
119 const float xsq = x * x;
120 return xsq * x * a_[3] + xsq * a_[2] + x * a_[1] + a_[0];
148 {
set ( 0, 0, 0, 0 ); }
152 set( v[0], v[1], v[2], v[3] );
157 set( vm1, v0, v1, v2 );
160 inline void set( T vm1, T v0, T v1, T v2 )
163 if ( v0udf_ && v1udf_ )
return;
165 if (
mIsUdf(vm1) ) vm1 = v0udf_ ? v1 : v0;
166 if (
mIsUdf(v2) ) v2 = v1udf_ ? v0 : v1;
167 if ( v0udf_ ) v0 = vm1;
168 if ( v1udf_ ) v1 = v2;
170 intp_.set( vm1, v0, v1, v2 );
175 if ( (v0udf_ && x < 0.5) || (v1udf_ && x >= 0.5) )
177 return intp_.apply( x );
200 inline T
parabolic1D(
float x0, T v0,
float x1, T v1,
float x2, T v2,
float x )
202 float xx0 = x - x0, xx1 = x-x1, xx2 = x-x2;
203 return v0 * xx1 * xx2 / ((x0 - x1) * (x0 - x2)) +
204 v1 * xx0 * xx2 / ((x1 - x0) * (x1 - x2)) +
205 v2 * xx0 * xx1 / ((x2 - x0) * (x2 - x1));
216 inline T
poly1D(
float x0, T v0,
float x1, T v1,
float x2, T v2,
217 float x3, T v3,
float x )
219 float xx0 = x - x0, xx1 = x-x1, xx2 = x-x2, xx3 = x-x3;
220 return v0 * xx1 * xx2 * xx3 / ((x0 - x1) * (x0 - x2) * (x0 - x3)) +
221 v1 * xx0 * xx2 * xx3 / ((x1 - x0) * (x1 - x2) * (x1 - x3)) +
222 v2 * xx0 * xx1 * xx3 / ((x2 - x0) * (x2 - x1) * (x2 - x3)) +
223 v3 * xx0 * xx1 * xx2 / ((x3 - x0) * (x3 - x1) * (x3 - x2));
235 return (-2 * vm2 + 8 * vm1 + 8 * v1 - 2 * v2) / 12;
247 return (vm3 - 6 * vm2 + 15 * vm1 + 15 * v1 - 6 * v2 + v3) / 20;
Definition: interpol1d.h:36
bool v1udf_
Definition: interpol1d.h:182
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
PolyReg1D< T > intp_
Definition: interpol1d.h:180
T apply(float x) const
Definition: interpol1d.h:173
T poly1D(float x0, T v0, float x1, T v1, float x2, T v2, float x3, T v3, float x)
Definition: interpol1d.h:216
#define mRounded(typ, x)
Definition: commondefs.h:47
iT linear1Di(float x0, iT v0, float x1, iT v1, float x)
Interpolate 1D regularly sampled, using a 3rd order polynome.
Definition: interpol1d.h:79
T linearReg1DWithUdf(T v0, T v1, float x)
Definition: interpol1d.h:55
Definition: interpol1d.h:90
T predictAtZero1D(T vm2, T vm1, T v1, T v2)
Definition: interpol1d.h:233
PolyReg1D(const T *v)
Definition: interpol1d.h:99
T polyReg1D(T vm1, T v0, T v1, T v2, float x)
Definition: interpol1d.h:128
PolyReg1D()
Definition: interpol1d.h:94
T apply(float x) const
Definition: interpol1d.h:117
PolyReg1DWithUdf(T vm1, T v0, T v1, T v2)
Definition: interpol1d.h:155
bool v0udf_
Definition: interpol1d.h:181
PolyReg1D(T vm1, T v0, T v1, T v2)
Definition: interpol1d.h:104
T polyReg1DWithUdf(T vm1, T v0, T v1, T v2, float x)
Definition: interpol1d.h:187
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
PolyReg1DWithUdf()
Definition: interpol1d.h:147
T linearReg1D(T v0, T v1, float x)
Definition: interpol1d.h:44
T linear1D(float x0, T v0, float x1, T v1, float x)
Definition: interpol1d.h:72
PolyReg1DWithUdf(const T *v)
Definition: interpol1d.h:150
T parabolic1D(float x0, T v0, float x1, T v1, float x2, T v2, float x)
Definition: interpol1d.h:200
#define mClass(module)
Definition: commondefs.h:161
PolyReg1D which smoothly handles undefined values.
Definition: interpol1d.h:143