Milena (Olena)
User documentation 2.0a Id
|
00001 // Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE) 00002 // 00003 // This file is part of Olena. 00004 // 00005 // Olena is free software: you can redistribute it and/or modify it under 00006 // the terms of the GNU General Public License as published by the Free 00007 // Software Foundation, version 2 of the License. 00008 // 00009 // Olena is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 // General Public License for more details. 00013 // 00014 // You should have received a copy of the GNU General Public License 00015 // along with Olena. If not, see <http://www.gnu.org/licenses/>. 00016 // 00017 // As a special exception, you may use this file as part of a free 00018 // software project without restriction. Specifically, if other files 00019 // instantiate templates or use macros or inline functions from this 00020 // file, or you compile this file and link it with other files to produce 00021 // an executable, this file does not by itself cause the resulting 00022 // executable to be covered by the GNU General Public License. This 00023 // exception does not however invalidate any other reasons why the 00024 // executable file might be covered by the GNU General Public License. 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 // float is a dummy parameter (real is C) 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 // looking for img(x); 00090 double x = v[0]; 00091 00092 // p1 00093 double xa = mln_point(I)::coord(v[0]); 00094 vsum ya = ima(point1d(xa)); 00095 00096 // x makes sens in img 00097 if (x == xa) 00098 return ima(xa); 00099 00100 // p2 00101 double xb = mln_point(I)::coord(v[0] + 1); 00102 vsum yb = ima(point1d(xb)); 00103 00104 // Taylor-young 00105 return convert::to<mln_value(I)> 00106 (ya + (x - xa) * (yb - ya) / (xb - xa)); 00107 } 00108 00109 # endif // ! MLN_INCLUDE_ONLY 00110 00111 } // end of namespace mln::fun::x2x 00112 00113 } // end of namespace mln::fun 00114 00115 } // end of namespace mln 00116 00117 00118 #endif // ! MLN_FUN_X2V_LINEAR_HH