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_CORE_ALIAS_WINDOW2D_HH
00027 # define MLN_CORE_ALIAS_WINDOW2D_HH
00028
00033
00034 # include <mln/core/window.hh>
00035 # include <mln/core/alias/dpoint2d.hh>
00036 # include <mln/metal/math/sqrt.hh>
00037 # include <mln/convert/from_to.hxx>
00038
00039
00040 namespace mln
00041 {
00042
00047
00048 typedef window<mln::dpoint2d> window2d;
00049
00052
00064 const window2d& win_c4p();
00065
00068
00080 const window2d& win_c8p();
00081
00082
00083 namespace convert
00084 {
00085
00086 namespace over_load
00087 {
00088
00089 template <unsigned S>
00090 void from_to_(const bool (&values)[S], window2d& win);
00091
00092 template <unsigned R, unsigned C>
00093 void from_to_(const bool (&values)[R][C], window2d& win);
00094
00095 }
00096
00097 }
00098
00099
00100
00101 # ifndef MLN_INCLUDE_ONLY
00102
00103 inline const window2d&
00104 win_c4p()
00105 {
00106 static window2d it;
00107 if (it.size() == 0)
00108 {
00109 it
00110 .insert( 0, -1)
00111 .insert(-1, 0)
00112 .insert( 0, 0)
00113 .insert(+1, 0)
00114 .insert( 0, +1);
00115 }
00116 return it;
00117 }
00118
00119 inline const window2d&
00120 win_c8p()
00121 {
00122 static window2d it;
00123 if (it.size() == 0)
00124 {
00125 it
00126 .insert(-1, -1)
00127 .insert( 0, -1)
00128 .insert(+1, -1)
00129 .insert(-1, 0)
00130 .insert( 0, 0)
00131 .insert(+1, 0)
00132 .insert(-1, +1)
00133 .insert( 0, +1)
00134 .insert(+1, +1);
00135 }
00136 return it;
00137 }
00138
00139
00140 namespace convert
00141 {
00142
00143 namespace over_load
00144 {
00145
00146 template <unsigned S>
00147 void
00148 from_to_(const bool (&values)[S], window2d& win)
00149 {
00150 enum { H = mlc_sqrt_int(S) / 2 };
00151 mlc_bool((2 * H + 1) * (2 * H + 1) == S)::check();
00152 win.clear();
00153 unsigned i = 0;
00154 const def::coord
00155 h = static_cast<def::coord>(H),
00156 _h = static_cast<def::coord>(-h);
00157 for (def::coord row = _h; row <= h; ++row)
00158 for (def::coord col = _h; col <= h; ++col)
00159 if (values[i++])
00160 win.insert(row, col);
00161 }
00162
00163 template <unsigned R, unsigned C>
00164 void
00165 from_to_(const bool (&values)[R][C], window2d& win)
00166 {
00167 mlc_bool(R % 2 == 1)::check();
00168 mlc_bool(C % 2 == 1)::check();
00169 win.clear();
00170 const def::coord
00171 drow = static_cast<def::coord>(R / 2),
00172 _drow = static_cast<def::coord>(- drow),
00173 dcol = static_cast<def::coord>(C / 2),
00174 _dcol = static_cast<def::coord>(- dcol);
00175 for (def::coord row = _drow; row <= drow; ++row)
00176 for (def::coord col = _dcol; col <= dcol; ++col)
00177 if (values[row + drow][col + dcol])
00178 win.insert(row, col);
00179 }
00180
00181 }
00182
00183 }
00184
00185 # endif // ! MLN_INCLUDE_ONLY
00186
00187 }
00188
00189
00190 #endif // ! MLN_CORE_ALIAS_WINDOW2D_HH