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 #include <mln/core/image/image3d.hh>
00027 #include <mln/canvas/browsing/snake_generic.hh>
00028 #include <mln/fun/p2v/iota.hh>
00029 #include <mln/debug/println.hh>
00030
00031
00032 template <typename I, typename F>
00033 struct assign_browsing_functor
00034 {
00035 typedef mln_site(I) S;
00036 enum { dim = S::dim };
00037
00038 typedef assign_browsing_functor<I, F> self;
00039 typedef mln_deduce(I, psite, delta) dpsite;
00040 typedef void (assign_browsing_functor<I,F>::*move_fun)();
00041
00042 I input;
00043 F f;
00044 std::vector<move_fun> moves;
00045 std::vector<dpsite> dps;
00046
00047 assign_browsing_functor(I& input, F f = F())
00048 : input(input),
00049 f(f),
00050 moves(5),
00051 dps(5)
00052 {
00053 dps[0] = dpsite(0, 0, 1);
00054 dps[1] = dpsite(0, 1, 0);
00055 dps[2] = dpsite(0, -1, 0);
00056 dps[3] = dpsite(1, 0, 0);
00057 dps[4] = dpsite(-1, 0, 0);
00058
00059 moves[0] = &self::thr;
00060 moves[1] = &self::down;
00061 moves[2] = &self::up;
00062 moves[3] = &self::fwd;
00063 moves[4] = &self::bkd;
00064 }
00065
00066 mln_psite(I) p;
00067
00068 void init() {}
00069 void final() {}
00070 void next()
00071 {
00072 input(p) = f(p);
00073 }
00074 void fwd() { std::cout << "fwd" << std::endl; next(); }
00075 void bkd() { std::cout << "bkd" << std::endl; next(); }
00076 void down() { std::cout << "down" << std::endl; next(); }
00077 void up() { std::cout << "up" << std::endl; next(); }
00078 void thr() { std::cout << "thr" << std::endl; next(); }
00079 };
00080
00081 namespace mln
00082 {
00083
00084 template <typename I, typename F, typename B>
00085 void my_test(Image<I>& ima_,
00086 const Function_v2v<F>& f_,
00087 const Browsing<B>& browse_)
00088 {
00089 I& ima = exact(ima_);
00090 const F& f = exact(f_);
00091 const B& browse = exact(browse_);
00092
00093 assign_browsing_functor<I, F> fun(ima, f);
00094 browse(fun);
00095 }
00096
00097 }
00098
00099
00100 int main()
00101 {
00102 using namespace mln;
00103 image3d<unsigned> ima(3, 3, 3);
00104
00105 ima(point3d(0,0,0)) = 42;
00106 std::cout << ima.bbox() << std::endl;
00107 my_test(ima, fun::p2v::iota(), canvas::browsing::snake_generic);
00108 debug::println(ima);
00109 }