
Je sais que y'a plein de trucs crades dans ce checkin, alors si vous avez des suggestions, n'hesitez pas a m'en faire part, j'en tiendrai compte lorsque je retoucherai tout ca (apres mon seminaire). Index: olena/ChangeLog from Damien Thivolle <damien@lrde.epita.fr> * oln/makefile.src: Add new files to the distribution. * oln/transforms/shapelets.hh: Small Changes. * oln/morpher/func_morpher.hh: Add file, image can now be seen through a functor. * oln/core/fpoint2d.hh: Add file. Contain floating point implementation. * oln/core/fdpoint2d.hh: Add file. Contain floating dpoint implementation. * oln/geom/translate.hh: Add file. Implementation of image translation using floating dpoint. * oln/geom/rotate.hh: Add file. Implementation of image rotation using floating point. -2004-07-06 Damien Thivolle <damien@lrde.epita.fr> +2004-06-07 Damien Thivolle <damien@lrde.epita.fr> * oln/transforms/shapelets.hh: Change functions to functors, bug fixes. Index: olena/oln/makefile.src --- olena/oln/makefile.src Mon, 14 Jun 2004 09:07:03 +0200 odou_s (oln/r/4_makefile.s 1.3 600) +++ olena/oln/makefile.src Tue, 15 Jun 2004 19:41:15 +0200 thivol_d (oln/r/4_makefile.s 1.3 600) @@ -76,7 +76,9 @@ core/dpoint2d.hxx \ core/dpoint3d.hh \ core/dpoint3d.hxx \ + core/fdpoint2d.hh \ core/fold.hh \ + core/fpoint2d.hh \ core/fwd_iter1d.hh \ core/fwd_iter2d.hh \ core/fwd_iter3d.hh \ @@ -113,6 +115,8 @@ core/window3d.hh \ core/winiter.hh \ core/winneighb.hh \ + geom/rotate.hh \ + geom/translate.hh \ io/base.hh \ io/basics.hh \ io/file.hh \ @@ -147,6 +151,7 @@ level/threshold.hh \ math/macros.hh \ morpher/color_morpher.hh \ + morpher/func_morpher.hh \ morpher/generic_morpher.hh \ morpher/iter_morpher.hh \ morpher/piece_morpher.hh \ Index: olena/oln/transforms/shapelets.hh --- olena/oln/transforms/shapelets.hh Mon, 07 Jun 2004 19:41:27 +0200 thivol_d (oln/r/10_shapelets. 1.2 600) +++ olena/oln/transforms/shapelets.hh Tue, 15 Jun 2004 19:39:53 +0200 thivol_d (oln/r/10_shapelets. 1.2 600) @@ -18,17 +18,21 @@ { T operator()(unsigned n, T x) { + if (n == 0) return 1; if (n == 1) return 2. * x; - return 2. * x * (*this)(n - 1, x) - 2. * double(n - 1) * (*this)(n - 2, x); + return 2. * x * (*this)(n - 1, x) - 2. * T(n - 1) * (*this)(n - 2, x); } }; template <class T> struct fact : public std::unary_function<T, T> { + + + T operator() (T n) { precondition(n >= 0); @@ -49,7 +53,7 @@ T operator()(int n, T x) { assert(n >= 0); - const double c = sqrt(pow(2.0, n) * sqrt(M_PI) * T(fact<int>()(n))); + const double c = sqrt(pow(2.0, n) * sqrt(M_PI) * fact<T>()(n)); return hermite<T>()(n, x) * exp(x * x / -2.0) / c; } @@ -111,6 +115,8 @@ func(k, l, double(it.row() - row), double(it.col() - col), b); } res[k * n + l] = s; + // std::cout << k << " - " << l << " = " << s << std::endl; + } return res; } @@ -136,9 +142,15 @@ for (int k = 0; k < m; k++) for (int l = 0; l < n; l++) // Add the value at the point + { + if (vec[k * n + l] * vec[k * n + l] > 40000) + { for_all(it) resf[it] += vec[k * n + l] * shapelets_basis<2, double>()(k, l, double(it.row() - nrows / 2), double(it.col() - ncols / 2), b); + //std::cout << k << " - " << l << std::endl; + } + } image2d<D> res(oln::image2d_size(nrows, ncols, 0)); Index: olena/oln/morpher/func_morpher.hh --- olena/oln/morpher/func_morpher.hh Tue, 15 Jun 2004 19:49:30 +0200 thivol_d () +++ olena/oln/morpher/func_morpher.hh Tue, 15 Jun 2004 16:01:36 +0200 thivol_d (oln/r/14_func_morph 644) @@ -0,0 +1,142 @@ +// Copyright (C) 2004 EPITA Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 59 Temple Place - Suite 330, Boston, +// MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + + + +#ifndef OLENA_MORPHER_FUNC_MORPHER_HH +# define OLENA_MORPHER_FUNC_MORPHER_HH + +# include <oln/morpher/generic_morpher.hh> + + +namespace oln { + + namespace morpher { + + template <class SrcType, class Ftor, class Exact = mlc::final> + struct func_morpher; + + + } // end of namespace morpher + + template <class SrcType, class Ftor, class Exact> + struct image_id<oln::morpher::func_morpher<SrcType, Ftor, Exact> > + { + enum {dim = SrcType::dim}; + /*! <The image dimension. */ + typedef oln_impl_type(SrcType) impl_type; + /*! <The underlying implementation.*/ + typedef oln_value_type(SrcType) value_type; + /*! <The modified value type.*/ + typedef typename mlc::exact_vt<oln::morpher::func_morpher<SrcType, Ftor, Exact>, + Exact>::ret exact_type; + + typedef oln_point_type(SrcType) point_type; + }; + + /*! Specialized version for subq_morpher. + ** + ** \param SrcType Input type decorated. + ** + ** \param N The new number of bits by components. + ** + ** \param Exact The exact type of the morpher. + */ + template <class SrcType, class Ftor, class Exact> + struct image_traits <oln::morpher::func_morpher<SrcType, Ftor, Exact> > : + public image_traits<oln::morpher::abstract::generic_morpher<SrcType, + typename image_id<oln::morpher::func_morpher<SrcType, Ftor, Exact> >::exact_type> > + { + }; + + namespace morpher { + + + + template <class SrcType, class Ftor, class Exact> + struct func_morpher: + public abstract::generic_morpher<SrcType, + typename oln::image_id<func_morpher<SrcType, Ftor, Exact> >::exact_type> + { + + Ftor f; + + /// The exact type of \a this. This class can be derived. + typedef typename oln::image_id<func_morpher<SrcType, Ftor, Exact> >::exact_type exact_type; + + /// The upper class. + typedef abstract::generic_morpher<SrcType, + exact_type> super_type; + + /// The value point of the resulting image. + typedef typename image_id<exact_type>::value_type value_type; + typedef typename image_id<exact_type>::point_type point_type; + typedef typename image_id<exact_type>::impl_type impl_type; + + /// Construct the morpher with an image. + func_morpher(const SrcType &ima, const Ftor f_) + : super_type(ima) + { f = f_;} + + /// Construct the morpher with another morpher. + func_morpher(const func_morpher<SrcType, Ftor>& r) + : super_type(r.get_ima()) + { f = r.f; } + + /*! Empty constructor. + ** + ** Needed by mlc_hierarchy::any_with_diamond. + */ + func_morpher() {} + + /// Return the value stored at \a p in the resulting image. + const value_type + at(const point_type& p) const + { + return f(ima_, p); + } + + /// Return the implementation. + const impl_type* + impl() const + { + return ima_.impl(); + } + + static std::string + name() + { + return "subq_morpher<" + SrcType::name() + ">"; + } + + }; + } +} + + + +#endif // !OLENA_MORPHER_FUNC_MORPHER_HH Index: olena/oln/core/fpoint2d.hh --- olena/oln/core/fpoint2d.hh Tue, 15 Jun 2004 19:49:30 +0200 thivol_d () +++ olena/oln/core/fpoint2d.hh Tue, 15 Jun 2004 14:23:37 +0200 thivol_d (oln/r/15_fpoint2d.h 644) @@ -0,0 +1,321 @@ +// Copyright (C) 2001, 2002, 2003, 2004 EPITA Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 59 Temple Place - Suite 330, Boston, +// MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +#ifndef OLENA_CORE_FPOINT2D_HH +# define OLENA_CORE_FPOINT2D_HH + +# include <iostream> + +# include <oln/core/abstract/image.hh> +# include <oln/core/point2d.hh> + +namespace oln { + + + // fwd decl + template <class F> + class fpoint2d; + + template <class F> + class fdpoint2d; + + /*! \class point_traits<fpoint2d> + ** + ** The specialized version for fpoint2d. + */ + + template<class F> + struct point_traits<fpoint2d<F> > + { + enum { dim = 2 }; + typedef fdpoint2d<F> dpoint_type; + }; + + /*! \class fpoint2d + ** + ** Olena Floating class point2d. + */ + + template <class F> + class fpoint2d + { + private: + + F coord_[2]; + + public: + + typedef fpoint2d<F> exact_type; + typedef fpoint2d<F> self_type; + typedef fdpoint2d<F> dpoint_type; + + fpoint2d(F x, F y) + { + coord_[0] = x; + coord_[1] = y; + } + + fpoint2d() + {} + + /// Give the value of the nth coordinate of the point. + + F + row() const + { + return coord_[0]; + } + + F& + row() + { + return coord_[0]; + } + + F + col() const + { + return coord_[1]; + } + + F& + col() + { + return coord_[1]; + } + + F + nth(const unsigned dim) const + { + assert(dim < 2); + return coord_[dim]; + } + + /// Return a reference to the nth coordinate of the point. + + F& + nth(const unsigned dim) + { + assert(dim < 2); + return coord_[dim]; + } + + exact_type + operator-() const + { + return exact_type(-coord_[0], -coord_[1]); + } + + exact_type& + operator+=(const dpoint_type& dp) + { + row() += dp.row(); + col() += dp.col(); + return *this; + } + + exact_type& + operator-=(const dpoint_type& dp) + { + row() += dp.row(); + col() += dp.col(); + return *this; + } + + dpoint_type + operator-(const self_type& p) const + { + dpoint_type dp(row() - p.row(), col() - p.col()); + return dp; + } + + + exact_type + operator-(const dpoint_type& dp) const + { + exact_type p = *this; + p += dp; + return p; + } + + dpoint_type + operator+(const self_type& p) const + { + dpoint_type dp(row() + p.row(), col() + p.col()); + return dp; + } + + exact_type + operator+(const dpoint_type& dp) const + { + exact_type p = *this; + p -= dp; + return p; + } + + + /*! \brief Test if \a p and the current point have the same coordinates + ** + ** \return True if \a p and the current point have the same coordinates, + ** false otherwise. + */ + + bool + operator==(const self_type& p) const + { + return p.nth(0) == coord_[0] && p.nth(1) == coord_[1]; + } + + + /*! \brief Test if \a p and the current point do + ** not have the same coordinates. + ** + ** \return False if \a p and the current point have + ** the same coordinates, true otherwise. + */ + + bool + operator!=(const self_type& p) const + { + return !(p.nth(0) == coord_[0] && p.nth(1) == coord_[1]); + } + + + + }; + + template <class T> + struct func_traits + { + }; + + template <class T, class F> + struct nearest; + + template <class T, class F> + struct bilinear; + + template <class T, class F> + struct func_traits<nearest<T, F> > + { + typedef F f_type; + }; + + template <class T, class F> + struct func_traits<bilinear<T, F> > + { + typedef F f_type; + }; + + template <class T, class Exact> + struct fpoint2d_access + { + + typedef typename func_traits<Exact>::f_type f_type; + + const T operator()(const image2d<T> &ima, const fpoint2d<f_type> p) const + { + return (static_cast<const Exact *>(this))->access_impl(ima, p); + } + + }; + + + template <class T, class F> + struct nearest : public fpoint2d_access<T, nearest<T, F> > + { + + const T access_impl(const image2d<T> &ima, const fpoint2d<F> p) const + { + + point2d p2d(int(p.nth(0)), int(p.nth(1))); + + if (ima.hold(p2d)) + return ima[p2d]; + else // FIXME : should be ntg_max_val(T) + return ntg::rgb_8(255, 255, 255); + } + + }; + + template <class T, class F> + struct bilinear : public fpoint2d_access<T, bilinear<T, F> > + { + + const T access_impl(const image2d<T> &ima, const fpoint2d<F> p) const + { + double x = floorf(p.nth(0)); + double y = floorf(p.nth(1)); + + int a = int(x); + int b = int(y); + + + if (ima.hold(point2d(a, b)) && ima.hold(point2d(a + 1, b + 1))) + { + int res[3]; + + res[0] = int((double(ima(a, b)[0]) * (x + 1 - p.nth(0)) + + double(ima(a + 1, b)[0]) * (p.nth(0) - x)) * (y + 1 - p.nth(1)) + + (double(ima(a, b + 1)[0]) * (p.nth(0) - x) + + double(ima(a + 1, b + 1)[0]) * (x + 1 - p.nth(0))) * (p.nth(1) - y)); + res[1] = int((double(ima(a, b)[1]) * (x + 1 - p.nth(0)) + + double(ima(a + 1, b)[1]) * (p.nth(0) - x)) * (y + 1 - p.nth(1)) + + (double(ima(a, b + 1)[1]) * (p.nth(0) - x) + + double(ima(a + 1, b + 1)[1]) * (x + 1 - p.nth(0))) * (p.nth(1) - y)); + res[2] = int((double(ima(a, b)[2]) * (x + 1 - p.nth(0)) + + double(ima(a + 1, b)[2]) * (p.nth(0) - x)) * (y + 1 - p.nth(1)) + + (double(ima(a, b + 1)[2]) * (p.nth(0) - x) + + double(ima(a + 1, b + 1)[2]) * (x + 1 - p.nth(0))) * (p.nth(1) - y)); + return ntg::rgb_8(res[0], res[1], res[2]); + } + else if (ima.hold(point2d(a, b))) + return ima(a, b); + else // FIXME : should be ntg_max_val(T) + return ntg::rgb_8(255, 255, 255); + } + + }; + + +} // end of oln + + +/// Write on an output stream \a o the coordinate of the fpoint2d \a p. + +template <class F> +inline std::ostream& +operator<<(std::ostream& o, const oln::fpoint2d<F>& p) +{ + return o << '(' << p.nth(0) << ',' << p.nth(1) << ')'; +} + + + + + +#endif // ! OLENA_CORE_FPOINT2D_HH Index: olena/oln/core/fdpoint2d.hh --- olena/oln/core/fdpoint2d.hh Tue, 15 Jun 2004 19:49:30 +0200 thivol_d () +++ olena/oln/core/fdpoint2d.hh Tue, 15 Jun 2004 11:02:18 +0200 thivol_d (oln/r/16_fdpoint2d. 644) @@ -0,0 +1,201 @@ +// Copyright (C) 2001, 2002, 2003, 2004 EPITA Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 59 Temple Place - Suite 330, Boston, +// MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +#ifndef OLENA_CORE_FDPOINT2D_HH +# define OLENA_CORE_FDPOINT2D_HH + +# include <iostream> + +# include <oln/core/abstract/image.hh> +# include <oln/core/fpoint2d.hh> + +namespace oln { + + // fwd decl + template <class F> + class dfpoint2d; + + + + /*! \class dpoint_traits<fdpoint2d> + ** + ** The specialized version for fdpoint2d. + */ + + template<class F> + struct dpoint_traits<fdpoint2d<F> > + { + enum { dim = 2 }; + typedef fpoint2d<F> point_type; + }; + + /*! \class fdpoint2d + ** + */ + + template <class F> + class fdpoint2d + { + private: + + F coord_[2]; + + + public: + + + typedef fdpoint2d<F> exact_type; + + fdpoint2d() + {} + + /// The coordinates of the dpoint2d are set to \a row and \a col. + + fdpoint2d(F row, F col) + { + coord_[0] = row; + coord_[1] = col; + } + + /// The coordinates of the dpoint2d are set to the \a p coordinates. + fdpoint2d(const exact_type& p) + { + coord_[0] = p.row(); + coord_[1] = p.col(); + } + + /// Return the value of the dpoint2d row coordinate. + + F + row() const + { + return coord_[0]; + } + + /// Return a reference to the dpoint2d row coordinate. + + F& + row() + { + return coord_[0]; + } + + /// Return the value of the dpoint2d column coordinate. + + F + col() const + { + return coord_[1]; + } + + /// Return a reference to the dpoint2d column coordinate. + + F& + col() + { + return coord_[1]; + } + + static std::string + name() + { + return "fdpoint2d"; + } + + exact_type + operator+(const exact_type& dp) const + { + exact_type tmp(*this); + tmp += dp; + return tmp; + } + + /*! \brief Return a dpoint2d whose coordinates are equal to + ** the opposite of the current dpoint2d coordinates. + */ + + exact_type + operator-() const + { + exact_type dp(-row(), -col()); + return dp; + } + + + /*! \brief Return a dpoint2d whose coordinates are equal to + ** the current dpoint2d coordinates minus \a dp coordinates. + */ + + exact_type + operator-(const exact_type& dp) const + { + exact_type tmp = *this; + tmp -= dp; + return tmp; + } + + + /*! \brief Return a reference to the current dpoint2d + ** plus \a dp. + */ + + exact_type& + operator+=(const exact_type& dp) + { + row() += dp.row(); + col() += dp.col(); + return *this; + } + + /*! \brief Return a reference to the current dpoint2d + ** minus \a dp. + */ + + exact_type& + operator-=(const exact_type& dp) + { + row() -= dp.row(); + col() -= dp.col(); + return *this; + } + }; + + +} // end of oln + +/// Write on an output stream \a o the coordinates of the dpoint2d \a dp. + +template <class F> +inline std::ostream& +operator<<(std::ostream& o, const oln::fdpoint2d<F> dp) +{ + o << "(" << dp.row() << "," << dp.col() << ")" << std::endl; + return o; +} + + +#endif // !OLENA_CORE_FDPOINT2D_HH Index: olena/oln/geom/translate.hh --- olena/oln/geom/translate.hh Tue, 15 Jun 2004 19:49:30 +0200 thivol_d () +++ olena/oln/geom/translate.hh Tue, 15 Jun 2004 11:53:36 +0200 thivol_d (oln/s/6_translate. 644) @@ -0,0 +1,72 @@ +// Copyright (C) 2001, 2002, 2003, 2004 EPITA Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 59 Temple Place - Suite 330, Boston, +// MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + + +#ifndef OLENA_GEOM_TRANSLATE_HH +# define OLENA_GEOM_TRANSLATE_HH + +# include <cmath> +# include <iostream> + +# include <oln/core/image2d.hh> +# include <oln/core/fpoint2d.hh> +# include <oln/core/fdpoint2d.hh> + +namespace oln { + + namespace geom { + + template <class T, class F, class Exact> + struct translate + { + typedef oln::image2d<T> im_type; + + + image2d<T> + operator()(const oln::image2d<T>& ima, + const fdpoint2d<F> dp, + fpoint2d_access<T, Exact> interp) + { + im_type res(ima.size()); + oln_iter_type(im_type) it(ima); + + for_all(it) + { + res[it] = interp(ima, fpoint2d<F>(it.row(), it.col()) - dp); + } + return res; + } + }; + } +} + + + + + +#endif // !OLENA_GEOM_TRANSLATE_HH + Index: olena/oln/geom/rotate.hh --- olena/oln/geom/rotate.hh Tue, 15 Jun 2004 19:49:30 +0200 thivol_d () +++ olena/oln/geom/rotate.hh Tue, 15 Jun 2004 16:07:48 +0200 thivol_d (oln/u/14_rotate.hh 644) @@ -0,0 +1,219 @@ +// Copyright (C) 2001, 2002, 2003, 2004 EPITA Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 59 Temple Place - Suite 330, Boston, +// MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +#ifndef OLENA_GEOM_ROTATE_HH +# define OLENA_GEOM_ROTATE_HH + +# include <cmath> +# include <iostream> + +# include <oln/core/image2d.hh> +# include <oln/core/fpoint2d.hh> + +namespace oln { + + namespace geom { + + template <class T, class Access> + struct ftor_rotate + { + private: + fpoint2d_access<T, Access> interp; + point2d center; + double cos_angle, sin_angle, a, b; + + public: + ftor_rotate(const point2d& center_, + const fpoint2d_access<T, Access>& interp_, + const double rad_angle_) : + interp(interp_), + center(center_) + { + cos_angle = cos(-rad_angle_); + sin_angle = sin(-rad_angle_); + + std::cout << sin_angle << " " << cos_angle << std::endl; + + a = double(center.row()); + b = double(center.col()); + + } + + ftor_rotate() {} + + ftor_rotate(const ftor_rotate<T, Access>& rhs) + { + interp = rhs.interp; + center = rhs.center; + cos_angle = rhs.cos_angle; + sin_angle = rhs.sin_angle; + a = rhs.a; + b = rhs.b; + } + + const T + operator()(const image2d<T>& ima, + const point2d p) const + { + double x, y; + double c, d; + + c = a + ima.size().nrows() / 2; + d = b + ima.size().ncols() / 2; + + x = cos_angle * double(p.row()) - sin_angle * double(p.col()) - + c * cos_angle + d * sin_angle + c; + y = sin_angle * double(p.row()) + cos_angle * double(p.col()) - + c * sin_angle - d * cos_angle + d; + + return interp(ima, fpoint2d<double>(x, y)); + } + }; + + template <class T, class Access> + struct rotate + { + typedef image2d<T> im_type; + + im_type + operator()(const im_type& ima, + const point2d center, + double rad_angle, + fpoint2d_access<T, Access> interp) + { + im_type res(ima.size()); + ftor_rotate<T, Access> f(center, interp, rad_angle); + oln_iter_type(im_type) it(res); + + for_all(it) + { + res[it] = f(ima, point2d(it.row(), it.col())); + } + return res; + } + }; + + + template <class T, class Access> + struct ftor_rotate_enlarge + { + private: + fpoint2d_access<T, Access> interp; + point2d center; + double cos_angle; + double sin_angle; + double a; + double b; + + public: + ftor_rotate_enlarge(const point2d& center_, + const fpoint2d_access<T, Access>& interp_, + const double rad_angle_) : + interp(interp_), + center(center_) + { + cos_angle = cos(-rad_angle_); + sin_angle = sin(-rad_angle_); + a = double(center.row()); + b = double(center.col()); + } + + ftor_rotate_enlarge() + {} + + ftor_rotate_enlarge(const ftor_rotate_enlarge& rhs) : + interp(rhs.interp), + center(rhs.center) + { + cos_angle = rhs.cos_angle; + sin_angle = rhs.sin_angle; + a = rhs.a; + b = rhs.b; + } + + T + operator()(const image2d<T>& ima, + const point2d p) + { + double x, y; + double c, d; + double rrows = ima.size().nrows() * cos_angle + + ima.size().ncols() * -sin_angle; + double rcols = ima.size().nrows() * -sin_angle + + ima.size().ncols() * cos_angle; + double vt = (rrows - ima.size().nrows()) / 2; + double ht = (rcols - ima.size().ncols()) / 2; + + c = a + ima.size().nrows() / 2; + d = b + ima.size().ncols() / 2; + + x = cos_angle * double(p.row() - vt) - sin_angle * double(p.col() - ht) - + c * cos_angle + d * sin_angle + c; + y = sin_angle * double(p.row() - vt) + cos_angle * double(p.col() - ht) - + c * sin_angle - d * cos_angle + d; + + return interp(ima, fpoint2d<double>(x, y)); + } + }; + + + + + template <class T, class Access> + struct rotate_enlarge + { + + typedef image2d<T> im_type; + + im_type + operator()(const im_type& ima, + const point2d center, + double rad_angle, + fpoint2d_access<T, Access> interp) + { + im_type res(image2d_size(int(ima.size().nrows() * cos(rad_angle) + + ima.size().ncols() * sin(rad_angle)), + int(ima.size().nrows() * sin(rad_angle) + + ima.size().ncols() * cos(rad_angle)), + 0)); + + oln_iter_type(im_type) it(res); + ftor_rotate_enlarge<T, Access> f(center, interp, rad_angle); + + for_all(it) + { + res[it] = f(ima, point2d(it.row(), it.col())); + } + return res; + } + }; + + } +} + + +#endif // !OLENA_CORE_FPOINT2D_HH -- Damien Thivolle damien.thivolle@lrde.epita.fr