Go to the documentation of this file.00001
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