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