contrib/mul/mbl/mbl_linear_interpolator.cxx
Go to the documentation of this file.
00001 // This is mul/mbl/mbl_linear_interpolator.cxx
00002 #include "mbl_linear_interpolator.h"
00003 
00004 #include <vcl_limits.h>
00005 #include <mbl/mbl_index_sort.h>
00006 
00007 
00008 mbl_linear_interpolator::mbl_linear_interpolator()
00009 {
00010   clear();
00011 }
00012 
00013 void mbl_linear_interpolator::clear()
00014 {
00015   x_.resize(0);
00016   y_.resize(0);
00017 }
00018 
00019 bool mbl_linear_interpolator::set(const vcl_vector<double> &x, const vcl_vector<double> &y)
00020 {
00021   bool ret=false;
00022   clear();
00023 
00024   if (x.size()==y.size() && x.size()>0)
00025   {
00026     x_=x;
00027     y_=y;
00028     sort();
00029     ret=true;
00030   }
00031 
00032   return ret;
00033 }
00034 
00035 void mbl_linear_interpolator::sort()
00036 {
00037    vcl_vector<int> index;
00038    mbl_index_sort(x_,index);
00039    vcl_vector<double> tmp_x=x_;
00040    vcl_vector<double> tmp_y=y_;
00041 
00042    for (unsigned i=0;i<index.size();++i)
00043    {
00044      x_[i]=tmp_x[index[i]];
00045      y_[i]=tmp_y[index[i]];
00046    }
00047 
00048 }
00049 
00050 
00051 double mbl_linear_interpolator::y(double x) const
00052 {
00053   double yval=vcl_numeric_limits<double>::quiet_NaN();
00054 
00055   if (x_.size()>0)
00056   {
00057     if (x<=x_.front())
00058       yval=y_.front();
00059     else if (x>=x_.back())
00060       yval=y_.back();
00061     else
00062     {
00063       for (unsigned i=1;i<x_.size();++i)
00064       {
00065         if (x<x_[i])
00066         {
00067           double x1=x_[i-1];
00068           double x2=x_[i];
00069           double y1=y_[i-1];
00070           double y2=y_[i];
00071           double f= (x-x1)/(x2-x1);
00072           yval=y1+f*(y2-y1);
00073           break;
00074         }
00075       }
00076     }
00077   }
00078 
00079   return yval;
00080 }
00081 
00082 
00083 
00084 
00085 
00086 
00087