27 #ifndef MLN_DEBUG_SLICES_2D_HH
28 # define MLN_DEBUG_SLICES_2D_HH
36 # include <mln/core/image/image2d.hh>
38 # include <mln/core/image/image3d.hh>
39 # include <mln/core/image/dmorph/slice_image.hh>
41 # include <mln/core/image/dmorph/p2p_image.hh>
42 # include <mln/fun/p2p/translation.hh>
44 # include <mln/data/paste.hh>
45 # include <mln/data/fill.hh>
60 unsigned n_horizontal,
unsigned n_vertical,
61 const mln_value(I)& bg);
70 const mln_value(I)& bg);
74 # ifndef MLN_INCLUDE_ONLY
80 unsigned n_horizontal,
unsigned n_vertical,
81 const mln_value(I)& bg)
83 trace::entering(
"debug::slices_2d");
84 mlc_equal(mln_domain(I),
box3d)::check();
86 const I& input = exact(input_);
88 mln_precondition(input.is_valid());
89 mln_precondition(n_horizontal > 0 && n_vertical > 0);
90 mln_precondition(input.nslis() <= n_horizontal * n_vertical);
93 input.ncols() * n_horizontal);
94 if (input.nslis() != n_horizontal * n_vertical)
97 const point3d& p_min = input.domain().pmin();
100 last_sli = input.domain().pmax().sli();
101 for (
unsigned i = 0; i < n_vertical; ++i)
102 for (
unsigned j = 0; j < n_horizontal; ++j)
104 dpoint2d dp(i * input.nrows() - p_min.row(),
105 j * input.ncols() - p_min.col());
107 fun::p2p::translation(dp)),
109 if (++sli > last_sli)
118 trace::exiting(
"debug::slices_2d");
127 unsigned round_up(
float f)
129 unsigned n =
static_cast<unsigned>(f + 0.499999f);
138 void slices2d_helper(
float nslis,
float nrows,
float ncols,
140 unsigned& n_horizontal,
141 unsigned& n_vertical)
145 float n_v = std::sqrt(nslis * ncols / ratio_hv / nrows);
146 n_vertical = internal::round_up(n_v);
147 float n_h = nslis / float(n_vertical);
148 n_horizontal = internal::round_up(n_h);
152 float n_h = std::sqrt(nrows * nslis * ratio_hv / ncols);
153 n_horizontal = internal::round_up(n_h);
154 float n_v = nslis / float(n_horizontal);
155 n_vertical = internal::round_up(n_v);
162 template <
typename I>
163 image2d<mln_value(I)>
166 const mln_value(I)& bg)
168 trace::entering(
"debug::slices_2d");
169 mlc_equal(mln_domain(I),
box3d)::check();
171 const I& input = exact(input_);
172 mln_precondition(input.is_valid());
173 mln_precondition(ratio_hv > 0.f);
175 unsigned n_horizontal, n_vertical;
176 internal::slices2d_helper(input.nslis(), input.nrows(), input.ncols(),
178 n_horizontal, n_vertical);
179 mln_assertion(n_horizontal * n_vertical >= input.nslis());
183 trace::exiting(
"debug::slices_2d");
188 # endif // ! MLN_INCLUDE_ONLY
195 #endif // ! MLN_DEBUG_SLICES_2D_HH