27 #ifndef SCRIBO_TABLE_INTERNAL_ALIGN_LINES_HH
28 # define SCRIBO_TABLE_INTERNAL_ALIGN_LINES_HH
35 # include <mln/core/site_set/box.hh>
37 # include <mln/accu/stat/mean.hh>
39 # include <mln/util/array.hh>
40 # include <mln/util/set.hh>
42 # include <mln/math/round.hh>
44 # include <scribo/core/macros.hh>
45 # include <scribo/core/component_set.hh>
107 unsigned max_alignment_diff);
111 # ifndef MLN_INCLUDE_ONLY
114 template <
typename L>
122 unsigned max_alignment_diff)
124 mln_trace(
"scribo::internal::align_lines");
126 mln_precondition(nsites > 0);
129 lines.resize(nsites);
132 for_all_comps(i, lines)
134 int minline = lines(i).bbox().pmin()[dim] - max_alignment_diff;
135 minline = (minline < min_coord ? min_coord : minline);
136 int maxline = lines(i).bbox().pmax()[dim] + max_alignment_diff;
137 maxline = (maxline > max_coord ? max_coord : maxline);
139 for (
int line = minline;
141 rlines[
line].insert(i);
146 box2line(value::next(lines.
nelements()), -1);
149 unsigned max_nelts = 0;
150 for_all_elements(i, rlines)
151 if (max_nelts < rlines[i].nelements())
160 while (max_nelts > 0)
162 for_all_elements(i, rlines)
163 if (rlines[i].nelements() == max_nelts)
166 for_all_elements(j, rlines[i])
167 if (box2line[rlines[i][j]] == -1)
168 mean.
take(lines(rlines[i][j]).
bbox().pcenter()[dim]);
172 for_all_elements(j, lines[i])
173 if (box2line[rlines[i][j]] == -1)
175 lines(rlines[i][j]).bbox().pmin()[dim] = math::round<int>(mean.
to_result());
176 lines(rlines[i][j]).bbox().pmax()[dim] = math::round<int>(mean.
to_result());
177 box2line[rlines[i][j]] = math::round<int>(mean.
to_result());
189 # endif // ! MLN_INCLUDE_ONLY
198 #endif // ! SCRIBO_TABLE_INTERNAL_ALIGN_LINES_HH