• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

diagonal2d.hh

00001 // Copyright (C) 2007, 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_CANVAS_BROWSING_DIAGONAL2D_HH
00027 # define MLN_CANVAS_BROWSING_DIAGONAL2D_HH
00028 
00032 
00033 # include <mln/core/concept/browsing.hh>
00034 # include <mln/core/concept/image.hh>
00035 
00036 namespace mln
00037 {
00038 
00039   namespace canvas
00040   {
00041 
00042     namespace browsing
00043     {
00044 
00046 
00081       struct diagonal2d_t : public Browsing< diagonal2d_t >
00082       {
00083         template <typename F>
00084         void operator()(F& f) const;
00085       };
00086 
00087       extern const diagonal2d_t diagonal2d;
00088 
00089 # ifndef MLN_INCLUDE_ONLY
00090 
00091       const diagonal2d_t diagonal2d;
00092 
00093       template <typename F>
00094       inline
00095       void
00096       diagonal2d_t::operator()(F& f) const
00097       {
00098         trace::entering("canvas::browsing::diagonal2d");
00099 
00100         typedef typename F::I I;
00101         typedef mln_deduce(I, psite, delta) dpsite;
00102         typedef mln_psite(I) psite;
00103 
00104         // Directions
00105         dpsite dp_first(1, 0);
00106         dpsite dp_second(0, 1);
00107         dpsite dp_diag(-1, 1);
00108 
00109         mln_deduce(I, psite, delta) diag;
00110 
00111         psite
00112           pmin = f.input.domain().pmin(),
00113           pmax = f.input.domain().pmax();
00114 
00115         f.p = pmin;
00116 
00117         f.init();
00118 
00119         while (f.input.domain().has(f.p))
00120         {
00121           psite start_diag = f.p;
00122           // Browse one diag.
00123           f.init_diag();
00124           while (f.input.domain().has(f.p))
00125           {
00126             f.next();
00127             f.p = f.p + dp_diag;
00128           }
00129 
00130           // Goto next diag start.
00131           f.p = start_diag + dp_first;
00132         }
00133         f.p = f.p - dp_first;
00134 
00135         f.p = f.p + dp_second;
00136         while (f.input.domain().has(f.p))
00137         {
00138           psite start_diag = f.p;
00139 
00140           // Browse one diag.
00141           f.init_diag();
00142           while (f.input.domain().has(f.p))
00143           {
00144             f.next();
00145             f.p = f.p + dp_diag;
00146           }
00147           f.p = f.p - dp_diag;
00148 
00149           // Goto next diag start.
00150           f.p = start_diag + dp_second;
00151         }
00152 
00153         f.final();
00154         trace::exiting("canvas::browsing::diagonal2d");
00155       }
00156 
00157 # endif // ! MLN_INCLUDE_ONLY
00158 
00159     } // end of namespace mln::canvas::browsing
00160 
00161   } // end of namespace mln::canvas
00162 
00163 } // end of namespace mln
00164 
00165 #endif // ! MLN_CANVAS_BROWSING_DIAGONAL2D_HH

Generated on Thu Sep 8 2011 18:31:45 for Milena (Olena) by  doxygen 1.7.1