00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_FUN_X2V_LINEAR_HH
00027 # define MLN_FUN_X2V_LINEAR_HH
00028
00034 # include <mln/core/image/image1d.hh>
00035 # include <mln/core/concept/function.hh>
00036 # include <mln/fun/internal/selector.hh>
00037 # include <mln/convert/to.hh>
00038 # include <mln/algebra/vec.hh>
00039
00040 namespace mln
00041 {
00042
00043 namespace fun
00044 {
00045
00046 namespace x2x
00047 {
00048
00052 template < typename I >
00053 struct linear
00054 : public fun::internal::selector_<const algebra::vec<1,float>,
00055
00056 mln_value(I), linear<I> >::ret
00057 {
00058 typedef mln_value(I) result;
00059
00061 linear(const I& ima);
00062
00065 template <typename C>
00066 mln_value(I)
00067 operator()(const algebra::vec<1,C>& v) const;
00068
00070 const I& ima;
00071 };
00072
00073
00074 # ifndef MLN_INCLUDE_ONLY
00075
00076 template <typename I>
00077 linear<I>::linear(const I& ima) : ima(ima)
00078 {
00079 mlc_bool(I::psite::dim == 1)::check();
00080 }
00081
00082 template <typename I>
00083 template <typename C>
00084 mln_value(I)
00085 linear<I>::operator()(const algebra::vec<1,C>& v) const
00086 {
00087 typedef mln_sum(mln_value(I)) vsum;
00088
00089
00090 double x = v[0];
00091
00092
00093 double xa = mln_point(I)::coord(v[0]);
00094 vsum ya = ima(point1d(xa));
00095
00096
00097 if (x == xa)
00098 return ima(xa);
00099
00100
00101 double xb = mln_point(I)::coord(v[0] + 1);
00102 vsum yb = ima(point1d(xb));
00103
00104
00105 return convert::to<mln_value(I)>
00106 (ya + (x - xa) * (yb - ya) / (xb - xa));
00107 }
00108
00109 # endif // ! MLN_INCLUDE_ONLY
00110
00111 }
00112
00113 }
00114
00115 }
00116
00117
00118 #endif // ! MLN_FUN_X2V_LINEAR_HH