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. More...
 
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. More...
 

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 200 of file interpolation.hpp.

References interpolateLinearCosine().

Referenced by ralab::base::base::interpolate_cubic(), ralab::base::base::interpolate_Hermite(), and ralab::base::base::utilities::HermiteInterpolate< TReal >::operator()().

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

§ 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 284 of file interpolation.hpp.

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

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