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