]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spring.cc
Run `make grand-replace'.
[lilypond.git] / lily / spring.cc
index 679ccfa29db3f00d2f792785a950e40be85f0b6a..cd63afa6702bc4b4ba9c59ce6ecca61512a920e8 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2007 Joe Neeman <joeneeman@gmail.com>
+  (c) 2007--2008 Joe Neeman <joeneeman@gmail.com>
 */
 
 #include "spring.hh"
@@ -61,20 +61,24 @@ merge_springs (vector<Spring> const &springs)
   Real avg_distance = 0;
   Real min_distance = 0;
   Real avg_stretch = 0;
+  Real avg_compress = 0;
 
   for (vsize i = 0; i < springs.size (); i++)
     {
       avg_distance += springs[i].distance ();
       avg_stretch += springs[i].inverse_stretch_strength ();
+      avg_compress += 1 / springs[i].inverse_compress_strength ();
       min_distance = max (springs[i].min_distance (), min_distance);
     }
 
   avg_stretch /= springs.size ();
+  avg_compress /= springs.size ();
   avg_distance /= springs.size ();
   avg_distance = max (min_distance + 0.3, avg_distance);
 
   Spring ret = Spring (avg_distance, min_distance);
   ret.set_inverse_stretch_strength (avg_stretch);
+  ret.set_inverse_compress_strength (1 / avg_compress);
 
   return ret;
 }
@@ -152,5 +156,12 @@ Spring::length (Real f) const
 {
   Real force = max (f, blocking_force_);
   Real inv_k = force < 0.0 ? inverse_compress_strength_ : inverse_stretch_strength_;
+
+  if (isinf (force))
+    {
+      programming_error ("cruelty to springs");
+      force = 0.0;
+    }
+
   return distance_ + force * inv_k;
 }