// -*- C++ -*-
// Linear Interpolation
//
// kasemir@lanl.gov
#ifndef __LINEARINTERPOLATION_H__
#define __LINEARINTERPOLATION_H__
//*
// The LinearTransformation class
// provides routines for linear transformation
// between two intervals,
// aptly named source and destination.
class LinearTransformation
{
public:
//* Default: 1-1 mapping
LinearTransformation ()
{
_scale=1;
_s0=0;
_s1=10;
_d0=0;
_d1=10;
}
//* Get start/end of source area.
double getS0 () const
{ return _s0; }
double getS1 () const
{ return _s1; }
//* Get start/end of destination area.
double getD0 () const
{ return _d0; }
double getD1 () const
{ return _d1; }
/** Setup LinearTransformation to
* transform into destination [d0...d1].
*/
void setDestination (double d0, double d1)
{
setup (_s0, _s1, d0, d1);
}
/** Setup LinearTransformation to
* transform from source [s0...s1].
*/
void setSource (double s0, double s1)
{ setup (s0, s1, _d0, _d1); }
/** Setup LinearTransformation to
* transform from source [s0...s1]
* into destination [d0...d1].
*/
void setup (double s0, double s1, double d0, double d1)
{
double ds = s1-s0;
if (ds == 0)
return;
_s0 = s0;
_s1 = s1;
_d0 = d0;
_d1 = d1;
_scale = (d1-d0)/ds;
}
/** Transform given source value s.
* Caution: If s outside [s0...s1], result will be outside [d0...d1]!
*/
double transform (double s) const
{
return (s-_s0)*_scale + _d0;
}
/** Try to transform given destination value d back into source.
* Caution: If d outside [d0...d1], result will be outside [s0...s1]!
*/
double inverse (double d) const
{
if (_scale == 0)
return 0;
return (d-_d0)/_scale + _s0;
}
private:
double _scale, _s0, _s1, _d0, _d1;
};
#endif //__LINEARINTERPOLATION_H__