- for (int i = 0; i < scores->size (); i++)
- {
- Real demerit = 0.0;
- for (int j = 0; j < collision_infos.size(); j++)
- {
- Drul_array<Offset> at = scores->elem (i).attachment_;
- Interval slur_wid (at[LEFT][X_AXIS], at[RIGHT][X_AXIS]);
-
- /*
- to prevent numerical inaccuracies in
- Bezier::get_other_coordinate().
- */
- slur_wid.widen (- 0.5 * thick);
- Real x = collision_infos[j].extents_[X_AXIS]
- .linear_combination (collision_infos[j].idx_);
- Real y = 0.0;
-
- if (!slur_wid.contains (x))
- {
- Direction contains_dir = CENTER;
- Direction d = LEFT;
- do
- {
- if (collision_infos[j].extents_[X_AXIS].contains (at[d][X_AXIS]))
- contains_dir = d;
- }
- while (flip (&d) != LEFT);
-
- if (!contains_dir)
- continue;
- else
- y = at[contains_dir][Y_AXIS];
- }
- else
- {
- y = scores->elem (i).curve_.get_other_coordinate (X_AXIS, x);
- }
-
- Real dist = collision_infos[j].extents_[Y_AXIS].distance (y);
- demerit +=
- fabs (0 >? (score_param->extra_encompass_free_distance_ - dist)) /
- score_param->extra_encompass_free_distance_
- * collision_infos[j].penalty_;
- }
-#if DEBUG_SLUR_QUANTING
- (*scores)[i].score_card_ += to_string ("X%.2f", demerit);
-#endif
- (*scores)[i].score_ += demerit;
- }
-}
-
-void
-score_edges (Grob *me, Grob *common[],
- Slur_score_parameters * score_param,
- Drul_array<Bound_info> extremes,
- Drul_array<Offset> base_attach,
- Array<Slur_score> *scores)
-{
- (void) common;
- Direction dir = get_grob_direction (me);
-
- for (int i = 0; i < scores->size (); i++)
- {
- Direction d = LEFT;
- do
- {
- Real y = scores->elem (i).attachment_[d][Y_AXIS];
- Real dy = fabs (y - base_attach[d][Y_AXIS]);
-
- Real factor = score_param->edge_attraction_factor_;
- Real demerit = factor * dy;
- if (extremes[d].stem_
- && extremes[d].stem_dir_ == dir
- && !Stem::get_beaming (extremes[d].stem_, -d)
- )
- demerit /= 5;
-
- (*scores)[i].score_ += demerit;
-#if DEBUG_SLUR_QUANTING
- (*scores)[i].score_card_ += to_string ("E%.2f", demerit);
-#endif
- }
- while (flip (&d) != LEFT);
- }
-}
-
-void
-score_slopes (Grob *me, Grob *common[],
- Slur_score_parameters *score_param,
- Drul_array<Bound_info> extremes,
- Drul_array<Offset> base_attach,
- Array<Slur_score> * scores)
-{
- (void) me;
- (void) base_attach;
-
- Drul_array<Real> ys;
- Direction d = LEFT;
- do
- {
- if (extremes[d].slur_head_)
- ys[d] = extremes[d].slur_head_->relative_coordinate (common[Y_AXIS],
- Y_AXIS);
- else
- ys[d] = extremes[d].neighbor_y_;
- }
- while (flip (&d) != LEFT);
-
- bool has_beams
- = (extremes[LEFT].stem_ && Stem::get_beam (extremes[LEFT].stem_))
- || (extremes[RIGHT].stem_ && Stem::get_beam (extremes[RIGHT].stem_));
-
- Real dy = ys[RIGHT] - ys[LEFT];
- for (int i = 0; i < scores->size (); i++)
- {
- Offset slur_dz = (*scores)[i].attachment_[RIGHT]
- - (*scores)[i].attachment_[LEFT];
- Real slur_dy = slur_dz[Y_AXIS];
- Real demerit = 0.0;
-
- demerit += ((fabs (slur_dy / slur_dz[X_AXIS])
- - score_param->max_slope_) >? 0)
- * score_param->max_slope_factor_;
-
- /* 0.2: account for staffline offset. */
- Real max_dy = (fabs (dy) + 0.2);
- if (has_beams)
- max_dy += 1.0;
-
- demerit += score_param->steeper_slope_factor_
- * ((fabs (slur_dy) -max_dy) >? 0);
-
- demerit += ((fabs (slur_dy/slur_dz[X_AXIS])
- - score_param->max_slope_) >? 0)
- * score_param->max_slope_factor_;
-
- if (sign (dy) == 0
- && sign (slur_dy) != 0)
- demerit += score_param->non_horizontal_penalty_;
-
- if (sign (dy)
- && sign (slur_dy)
- && sign (slur_dy) != sign (dy))
- demerit += has_beams
- ? score_param->same_slope_penalty_ / 10
- : score_param->same_slope_penalty_;
-
-#if DEBUG_SLUR_QUANTING
- (*scores)[i].score_card_ += to_string ("S%.2f", d);
-#endif
- (*scores)[i].score_ += demerit;
- }