X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fsimple-spacer.hh;h=80f7a32904e504633d5e8e80a4b18e742949fc48;hb=998986bbd15afaafb24904a777e8be9ba1233799;hp=1f6fc479c09714833435adfe94c2441a16f2ec8b;hpb=6ae532ffb4350961d3901a42b67d1db620f925a5;p=lilypond.git diff --git a/lily/include/simple-spacer.hh b/lily/include/simple-spacer.hh index 1f6fc479c0..80f7a32904 100644 --- a/lily/include/simple-spacer.hh +++ b/lily/include/simple-spacer.hh @@ -1,47 +1,87 @@ /* - simple-spacer.hh -- declare + simple-spacer.hh -- declare Simple_spacer source file of the GNU LilyPond music typesetter - (c) 1998 Han-Wen Nienhuys + (c) 1999 Han-Wen Nienhuys */ #ifndef SIMPLE_SPACER_HH #define SIMPLE_SPACER_HH -#include "real.hh" -#include "array.hh" -#include "lily-proto.hh" -#include "list.hh" -#include "drul-array.hh" +#include "parray.hh" +#include "line-spacer.hh" -struct Rod_info { - Real distance_f_; - Drul_array cols_; -}; - -struct Spring_info { - /// the ideal distance - Real space_f_; - /// Hooke's constant: how strong are the "springs" attached to columns +struct Spring_description +{ + Real ideal_f_; Real hooke_f_; + bool active_b_; - Real blocking_stretch_f_; - Rod_info * blocking_rod_l_; - void set (Idealspacing *); - Spring_info(); + Real block_force_f_; + + Real length (Real force) const; + Spring_description (); + Real energy_f (Real) const; }; +/** + A simple spacing constraint solver. The approach: + + Stretch the line uniformly until none of the constraints (rods) + block. It then is very wide. + + + Compress until the next constraint blocks, + + Mark the springs over the constrained part to be non-active. + + Repeat with the smaller set of non-active constraints, until all + constraints blocked, or until the line is as short as desired. + + This is much simpler, and much much faster than full scale + Constrained QP. On the other hand, a situation like this will not + be typeset as dense as possible, because -class Simple_spring_spacer { - Array springs_; - Pointer_list rods_; + c4 c4 c4 c4 + veryveryverylongsyllable2 veryveryverylongsyllable2 + " "4 veryveryverylongsyllable2 syllable4 - void init (); - Array solve (); + + can be further compressed to + + + c4 c4 c4 c4 + veryveryverylongsyllable2 veryveryverylongsyllable2 + " "4 veryveryverylongsyllable2 syllable4 + + + Perhaps this is not a bad thing, because the 1st looks better anyway. */ +struct Simple_spacer: public Line_spacer +{ + Array springs_; + Real force_f_; + + Simple_spacer (); + virtual void solve (Column_x_positions *) const; + virtual void lower_bound_solution (Column_x_positions *) const; + virtual void add_columns (Link_array); + + void my_solve_linelen (); + void my_solve_natural_len (); + Real active_springs_stiffness () const; + Real range_stiffness (int, int) const; + void add_rod (int l, int r, Real dist); + Real range_ideal_len (int l, int r)const; + Real active_blocking_force ()const; + Real configuration_length ()const; + void set_active_states (); + Real energy_f () const; + + bool active_b () const; }; #endif /* SIMPLE_SPACER_HH */