X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspring.cc;h=67d41c9c39640e0add681aa50728ec5e5f240861;hb=c08af381a1f23a3656d845b86895a9f2a955590b;hp=679ccfa29db3f00d2f792785a950e40be85f0b6a;hpb=aa3b078b76a1e8457388b022ff5d1fc0c4820d3b;p=lilypond.git diff --git a/lily/spring.cc b/lily/spring.cc index 679ccfa29d..67d41c9c39 100644 --- a/lily/spring.cc +++ b/lily/spring.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2007 Joe Neeman + (c) 2007--2009 Joe Neeman */ #include "spring.hh" @@ -61,20 +61,24 @@ merge_springs (vector 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; }