]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/simple-spacer.cc
Run `make grand-replace'.
[lilypond.git] / lily / simple-spacer.cc
index c8b6490c37bff61117c6fefbc4effa9d2a4aba49..9b0a322b1cb37e2e9e24560549d3990c2617b148 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   TODO:
   - add support for different stretch/shrink constants?
@@ -81,8 +81,11 @@ Real
 Simple_spacer::rod_force (int l, int r, Real dist)
 {
   Real d = range_ideal_len (l, r);
-  Real c = range_stiffness (l, r, d > dist);
+  Real c = range_stiffness (l, r, dist > d);
   Real block_stretch = dist - d;
+
+  if (isinf (c) && block_stretch == 0) /* take care of the 0*infinity_f case */
+    return 0;
   return c * block_stretch;
 }
 
@@ -102,7 +105,12 @@ Simple_spacer::add_rod (int l, int r, Real dist)
       Real spring_dist = range_ideal_len (l, r);
       if (spring_dist < dist)
        for (int i = l; i < r; i++)
-         springs_[i].set_distance (springs_[i].distance () * dist / spring_dist);
+         {
+           if (spring_dist)
+             springs_[i].set_distance (springs_[i].distance () * dist / spring_dist);
+           else
+             springs_[i].set_distance (dist / (r - l));
+         }
 
       return;
     }
@@ -167,6 +175,9 @@ Simple_spacer::expand_line ()
   for (vsize i=0; i < springs_.size (); i++)
     inv_hooke += springs_[i].inverse_stretch_strength ();
 
+  if (inv_hooke == 0.0) /* avoid division by zero. If springs are infinitely stiff */
+    return 0.0;         /* anyway, then it makes no difference what the force is */
+
   assert (cur_len <= line_len_);
   return (line_len_ - cur_len) / inv_hooke + force_;
 }
@@ -200,6 +211,7 @@ Simple_spacer::compress_line ()
 
   vector<Spring> sorted_springs = springs_;
   sort (sorted_springs.begin (), sorted_springs.end (), greater<Spring> ());
+
   for (vsize i = 0; i < sorted_springs.size (); i++)
     {
       Spring sp = sorted_springs[i];
@@ -259,25 +271,11 @@ Simple_spacer::force_penalty (bool ragged) const
 
   /* Use a convex compression penalty. */
   Real f = force_;
-  return f - (f < 0 ? f*f*f*f*4 : 0);
+  return f - (f < 0 ? f*f*f*f*2 : 0);
 }
 
 /****************************************************************/
 
-/*
-  TODO: should a add penalty for widely varying spring forces (caused
-  by constraints, eg.
-
-
-  .     =====
-  .     |   |
-  .o|o|x ##x
-  .
-
-  The ## forces the notes apart; we shouldn't allow the O's to touch
-  this closely.
-*/
-
 struct Rod_description
 {
   vsize r_;