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_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
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
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
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
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
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 }
00160
00161 }
00162
00163 }
00164
00165 #endif // ! MLN_CANVAS_BROWSING_DIAGONAL2D_HH