33 INT_VAR (pitsync_linear_version, 6,
"Use new fast algorithm");
36 "Dist inside big blob for chopping");
39 "Fraction of cut for free cuts");
54 mean_sum = cutpt->
sum ();
98 FPSEGPT_LIST * prev_list
107 FPSEGPT_IT pred_it = prev_list;
115 for (pred_it.mark_cycle_pt (); !pred_it.cycled_list (); pred_it.forward ()) {
116 segpt = pred_it.data ();
119 dist = x - segpt->xpos;
120 if (dist >= pitch - pitch_error && dist <= pitch + pitch_error
122 total = segpt->mean_sum + dist;
123 sq_dist = dist * dist + segpt->sq_sum + offset * offset;
125 mean = total / region_index;
126 factor = mean - pitch;
128 factor += sq_dist / (region_index) - mean * mean;
152 BLOBNBOX_IT *blob_it,
157 FPSEGPT_LIST *seg_list
168 inT16 best_region_index = 0;
176 FPSEGPT_LIST *segpts;
184 FPSEGPT_IT outseg_it = seg_list;
185 FPSEGPT_LIST_CLIST lattice;
187 FPSEGPT_LIST_C_IT lattice_it = &lattice;
195 if ((pitch - 3) / 2 < pitch_error)
196 pitch_error = (pitch - 3) / 2;
204 left_edge = min_box.
left () + pitch_error;
205 for (min_index = 1; min_index < blob_count; min_index++) {
212 right_edge = min_box.
right ();
215 min_x = max_x - pitch + pitch_error * 2 + 1;
216 right_max = right_edge + pitch - pitch_error - 1;
217 segpts =
new FPSEGPT_LIST;
218 segpt_it.set_to_list (segpts);
219 for (x = min_x; x <= max_x; x++) {
222 segpt_it.add_after_then_move (segpt);
225 lattice_it.add_before_then_move (segpts);
235 segpts =
new FPSEGPT_LIST;
236 segpt_it.set_to_list (segpts);
237 min_x += pitch - pitch_error;
238 max_x += pitch + pitch_error;
239 while (min_box.
right () < min_x && min_index < blob_count) {
244 max_index = min_index;
247 for (x = min_x; x <= max_x && x <= right_max; x++) {
248 while (x < right_edge && max_index < blob_count
249 && x > max_box.
right ()) {
254 if (x <= max_box.
left () + pitch_error
255 || x >= max_box.
right () - pitch_error || x >= right_edge
256 || (max_index < blob_count - 1 && x >= next_box.
left ())
260 if (x - max_box.
left () > 0
261 && x - max_box.
left () <= pitch_error)
263 offset = x - max_box.
left ();
264 else if (max_box.
right () - x > 0
265 && max_box.
right () - x <= pitch_error
266 && (max_index >= blob_count - 1
267 || x < next_box.
left ()))
268 offset = max_box.
right () - x;
273 pitch, pitch_error, lattice_it.data ());
277 segpt =
new FPSEGPT (x,
TRUE, offset, region_index,
278 pitch, pitch_error, lattice_it.data ());
281 segpt_it.add_after_then_move (segpt);
282 if (x >= right_edge - pitch_error) {
288 best_region_index = region_index;
293 && right_best_x == x - 1)
301 if (segpts->empty ()) {
302 if (best_end !=
NULL)
305 region_index, pitch, pitch_error, segpts);
308 if (right_best_x > left_best_x + 1) {
309 left_best_x = (left_best_x + right_best_x + 1) / 2;
310 for (segpt_it.mark_cycle_pt (); !segpt_it.cycled_list ()
311 && segpt_it.data ()->position () != left_best_x;
312 segpt_it.forward ());
313 if (segpt_it.data ()->position () == left_best_x)
315 best_end = segpt_it.data ();
319 lattice_it.add_before_then_move (segpts);
322 while (min_x < right_edge);
325 for (lattice_it.mark_cycle_pt (); !lattice_it.cycled_list ();
326 lattice_it.forward ()) {
327 segpts = lattice_it.data ();
328 segpt_it.set_to_list (segpts);
340 for (segpt_it.mark_cycle_pt (); !segpt_it.cycled_list ()
341 && segpt_it.data () != best_end; segpt_it.forward ());
342 if (segpt_it.data () == best_end) {
344 segpt = segpt_it.extract ();
345 outseg_it.add_before_then_move (segpt);
351 outseg_it.move_to_last ();
352 mean_sum = outseg_it.data ()->sum ();
353 mean_sum = mean_sum * mean_sum / best_region_index;
354 if (outseg_it.data ()->squares () - mean_sum < 0)
355 tprintf (
"Impossible sqsum=%g, mean=%g, total=%d\n",
356 outseg_it.data ()->squares (), outseg_it.data ()->sum (),
358 lattice.deep_clear ();
359 return outseg_it.data ()->squares () - mean_sum;
370 FPSEGPT_LIST *prev_list,
376 FPSEGPT_LIST *seg_list
385 FPSEGPT_IT segpt_it = seg_list;
387 FPSEGPT_IT prevpt_it = prev_list;
390 for (prevpt_it.mark_cycle_pt (); !prevpt_it.cycled_list ();
391 prevpt_it.forward ()) {
392 prevpt = prevpt_it.data ();
403 min_x += pitch - pitch_error;
404 max_x += pitch + pitch_error;
405 for (x = min_x; x <= max_x; x++) {
406 while (x > blob_box.
right ()) {
409 offset = x - blob_box.
left ();
410 if (blob_box.
right () - x < offset)
411 offset = blob_box.
right () - x;
413 region_index, pitch, pitch_error, prev_list);
416 fprintf (stderr,
"made fake at %d\n", x);
418 segpt_it.add_after_then_move (segpt);