ProteoWizard
Classes | Functions
ralab::base::base::utilities Namespace Reference

Classes

struct  CosineInterpolate
 CosineInterpolate Functor Linear interpolation results in discontinuities at each point. More...
 
struct  CubicInterpolate
 CubicInterpolate Functor. More...
 
struct  HermiteInterpolate
 HermiteInterpolation. More...
 
struct  LinearInterpolate
 LinearInterpolate Functor. More...
 
struct  SeqMinus
 
struct  SeqPlus
 

Functions

template<typename YInputIterator , typename XInputIterator , typename OutputIterator , typename TFunctor >
static void interpolateCubicHermite (YInputIterator begY, YInputIterator endY, XInputIterator begX, XInputIterator endX, OutputIterator out, TFunctor &functor, int start_index=0)
 Cubic or Hermite interpolation worker.
 
template<typename YInputIterator , typename XInputIterator , typename OutputIterator , typename TFunctor >
static void interpolateLinearCosine (YInputIterator y_p, YInputIterator endY, XInputIterator x_p, XInputIterator endX, OutputIterator out_p, TFunctor &interpolator, int start_index=0)
 Linear cubic interpolator worker.
 

Function Documentation

◆ interpolateCubicHermite()

template<typename YInputIterator , typename XInputIterator , typename OutputIterator , typename TFunctor >
static void ralab::base::base::utilities::interpolateCubicHermite ( YInputIterator  begY,
YInputIterator  endY,
XInputIterator  begX,
XInputIterator  endX,
OutputIterator  out,
TFunctor &  functor,
int  start_index = 0 
)
static

Cubic or Hermite interpolation worker.

Parameters
outinterpolated values, same length as x.
functoreither CubicInterpolate or HermiteInterpolate

Definition at line 199 of file interpolation.hpp.

209 {
210 typedef typename std::iterator_traits<OutputIterator>::value_type TReal;
211 //size_t nrX = std::distance( begX , endX );
212 size_t nrY = std::distance( begY , endY );
213 OutputIterator outI = out;
214
215 for( unsigned int i = 0 ; begX != endX ; ++i , ++begX, ++outI )
216 {
217 double xd = *begX - start_index;
218 int index = static_cast<int>(floor(xd));
219 //interpolate
220 TReal mu = xd - static_cast<double>(index);
221 if(index < -1)
222 {
223 *outI = *begY;
224 }
225 else if(index == -1)
226 {
227 TReal y1 = *begY;
228 TReal y2 = *begY;
229 TReal y3 = *begY;
230 TReal y4 = *(begY+1);
231 *outI = functor(y1 , y2 , y3 , y4 , mu );
232 }
233 //extrapolate
234 else if(index == 0 )
235 {
236 TReal y1 = 0;
237 TReal y2 = *begY;
238 TReal y3 = *(begY+1);
239 TReal y4 = *(begY+2);
240 *outI = functor(y1 , y2 , y3 , y4 , mu );
241 }
242 else if( index > 0 && index < static_cast<int>(nrY - 2) )//the normal case
243 {
244 YInputIterator begTmp = (begY + index - 1);
245 TReal y1 = *begTmp;
246 TReal y2 = *(begTmp + 1);
247 TReal y3 = *(begTmp + 2);
248 TReal y4 = *(begTmp + 3);
249 *outI = functor(y1 , y2 , y3 , y4 , mu );
250 }
251 else if(index == static_cast<int>(nrY-2) ) //you are getting out of range
252 {
253 YInputIterator begTmp = (begY + index - 1);
254 TReal y1 = *begTmp;
255 TReal y2 = *(begTmp+1);
256 TReal y3 = *(begTmp+2);
257 TReal y4 = 0 ;
258 *outI = functor(y1 , y2 , y3 , y4 ,mu);
259 }
260 else if(index == static_cast<int>(nrY-1) ) //you are even farther out...
261 {
262 YInputIterator begTmp = (begY + index - 1);
263 TReal y1 = *begTmp;
264 TReal y2 = *(begTmp+1);
265 TReal y3 = *(begTmp+1);
266 TReal y4 = *(begTmp+1);
267 *outI = functor(y1 , y2 , y3 , y4 , mu );
268 }
269 else
270 {
271 *outI = *(endY-1);
272 }
273 }//end for
274 }//end interpolate_cubic

Referenced by ralab::base::base::interpolate_cubic(), and ralab::base::base::interpolate_Hermite().

◆ interpolateLinearCosine()

template<typename YInputIterator , typename XInputIterator , typename OutputIterator , typename TFunctor >
static void ralab::base::base::utilities::interpolateLinearCosine ( YInputIterator  y_p,
YInputIterator  endY,
XInputIterator  x_p,
XInputIterator  endX,
OutputIterator  out_p,
TFunctor &  interpolator,
int  start_index = 0 
)
static

Linear cubic interpolator worker.

Parameters
y_py values equidistantly spaced. spacing is [0,1,2, .... ,len(y)]
x_ppoints to interpolate at
out_pinterpolated values, same length as x.
interpolatorinterpolation functor, either: CosineInterpolate, LinearInterpolate.
start_indexif y values are placed on a grid with start_index != 0

Definition at line 283 of file interpolation.hpp.

293 {
294 typedef typename std::iterator_traits<OutputIterator>::value_type TReal ;
295 size_t nrX = std::distance(x_p,endX);
296 size_t nrY = std::distance(y_p,endY);
297 TReal xd;
298
299 for(unsigned int i = 0 ; i < nrX; ++i, ++x_p, ++out_p)
300 {
301 xd = * x_p - start_index;
302 double indexd = floor(xd);
303 int index = static_cast<int>( indexd );
304 assert(fabs (index - indexd) < 0.001);
305
306 //interpolate
307 if(index < 0 )
308 {
309 *out_p = *y_p;
310 }else if( index < static_cast<int>(nrY-1) )
311 {
312 TReal mu = xd - indexd;
313 YInputIterator y1_p = (y_p + index);
314 TReal y1 = *y1_p;
315 TReal y2 = *(++y1_p);
316 *out_p = interpolator(y1,y2,mu);
317 }
318 else
319 {
320 *out_p = *(y_p + (nrY-1));
321 }
322 }//end for
323 }//end interpolate cubic

Referenced by ralab::base::base::interpolate_cosine(), and ralab::base::base::interpolate_linear().