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_MAKE_W_WINDOW3D_HH
00027 # define MLN_MAKE_W_WINDOW3D_HH
00028
00034 # include <cmath>
00035
00036 # include <mln/core/w_window.hh>
00037 # include <mln/core/alias/dpoint3d.hh>
00038
00039 #include <iostream>
00040
00041 namespace mln
00042 {
00043
00044 namespace make
00045 {
00046
00055 template <typename W, unsigned M>
00056 mln::w_window<mln::dpoint3d, W> w_window3d(W (&weights)[M]);
00057
00058
00059 # ifndef MLN_INCLUDE_ONLY
00060
00061 template <typename W, unsigned M>
00062 inline
00063 mln::w_window<mln::dpoint3d, W>
00064 w_window3d(W (&weights)[M])
00065 {
00066 int h = unsigned(std::pow(float(M), float(1. / 3))) / 2;
00067 mln_precondition((2 * h + 1) * (2 * h + 1) * (2 * h + 1) == M);
00068 mln::w_window<mln::dpoint3d, W> tmp;
00069 unsigned i = 0;
00070 for (int sli = - h; sli <= h; ++sli)
00071 for (int row = - h; row <= h; ++row)
00072 for (int col = - h; col <= h; ++col)
00073 {
00074 const W& cur = weights[i];
00075
00076 if (cur != 0)
00077 tmp.insert(cur, dpoint3d(sli, row, col));
00078 i++;
00079 }
00080 return tmp;
00081 }
00082
00083 # endif // ! MLN_INCLUDE_ONLY
00084
00085 }
00086
00087 }
00088
00089
00090 #endif // ! MLN_MAKE_W_WINDOW3D_HH