/*
- Determine whether a beam is concave.
- */
+ Determine whether a beam is concave.
+*/
#include <math.h>
bool above = false;
bool below = false;
bool concave = false;
-
+
/*
notes above and below the interval covered by 1st and last note.
- */
+ */
for (int i = 1; i < positions.size () - 1; i++)
{
above = above || (positions[i] > covering[UP]);
below = below || (positions[i] < covering[DOWN]);
}
-
concave = concave || (above && below);
/*
A note as close or closer to the beam than begin and end, but the
note is reached in the opposite direction as the last-first dy
- */
- int dy = positions.top() - positions[0];
- int closest = (beam_dir * positions.top()) >? (beam_dir *positions[0]);
+ */
+ int dy = positions.top () - positions[0];
+ int closest = (beam_dir * positions.top ()) >? (beam_dir *positions[0]);
for (int i = 2; !concave && i < positions.size () - 1; i++)
{
- int inner_dy = positions[i] - positions[i-1];
+ int inner_dy = positions[i] - positions[i - 1];
if (sign (inner_dy) != sign (dy)
&& (beam_dir * positions[i] >= closest
- || beam_dir * positions[i-1] >= closest))
+ || beam_dir * positions[i - 1] >= closest))
concave = true;
}
-
- bool all_closer = true;
- for (int i = 1; all_closer && i < positions.size ()-1; i++)
+
+ bool all_closer = true;
+ for (int i = 1; all_closer && i < positions.size () - 1; i++)
{
- all_closer = all_closer &&
- (beam_dir * positions[i] > closest);
+ all_closer = all_closer
+ && (beam_dir * positions[i] > closest);
}
concave = concave || all_closer;
calc_concaveness (Array<int> const &positions, Direction beam_dir)
{
Real dy = positions.top () - positions[0];
- Real slope = dy / Real (positions.size() - 1);
+ Real slope = dy / Real (positions.size () - 1);
Real concaveness = 0.0;
- for (int i = 1; i < positions.size() - 1; i++)
+ for (int i = 1; i < positions.size () - 1; i++)
{
Real line_y = slope * i + positions[0];
concaveness += (beam_dir * (positions[i] - line_y)) >? 0.0;
}
- concaveness /= positions.size () ;
+ concaveness /= positions.size ();
/*
Normalize. For dy = 0, the slope ends up as 0 anyway, so the
{
Grob *me = unsmob_grob (smob);
- Link_array<Grob> stems =
- extract_grob_array (me, ly_symbol2scm ("stems"));
+ Link_array<Grob> stems
+ = extract_grob_array (me, ly_symbol2scm ("stems"));
if (is_knee (me))
return SCM_UNSPECIFIED;
-
+
Direction beam_dir = CENTER;
- for (int i = stems.size (); i--; )
+ for (int i = stems.size (); i--;)
{
if (Stem::is_invisible (stems[i]))
stems.del (i);
beam_dir = dir;
}
}
-
+
if (stems.size () <= 2)
return SCM_UNSPECIFIED;
-
Array<int> close_positions;
Array<int> far_positions;
for (int i = 0; i < stems.size (); i++)
Hmmm.. wait, for the beams in the last measure of morgenlied,
this doesn't look so good. Let's try the heads farthest from
the beam.
-
- */
+
+ */
Interval posns = Stem::head_positions (stems[i]);
-
+
close_positions.push ((int) rint (posns[beam_dir]));
far_positions.push ((int) rint (posns[-beam_dir]));
}
- if (is_concave_single_notes (far_positions, beam_dir))
+ if (is_concave_single_notes (far_positions, beam_dir))
{
Drul_array<Real> pos = ly_scm2interval (me->get_property ("positions"));
Real r = linear_combination (pos, 0.0);
else
{
Real concaveness = (calc_concaveness (far_positions, beam_dir)
- + calc_concaveness (close_positions, beam_dir))/2;
-
+ + calc_concaveness (close_positions, beam_dir)) / 2;
me->set_property ("concaveness", scm_from_double (concaveness));
}
-
+
return SCM_UNSPECIFIED;
}