]> git.donarmstrong.com Git - lilypond.git/commitdiff
more robustness to inf and nan in simple-spacer and spring
authorJoe Neeman <joeneeman@gmail.com>
Fri, 13 Jul 2007 00:23:33 +0000 (10:23 +1000)
committerJoe Neeman <joeneeman@gmail.com>
Fri, 13 Jul 2007 00:23:33 +0000 (10:23 +1000)
lily/simple-spacer.cc
lily/spring.cc

index 8e0722438e4195c7fa45a4cb544639dd9849079a..fcad2f18c126897929ce27c4690d994334810ede 100644 (file)
@@ -83,6 +83,9 @@ Simple_spacer::rod_force (int l, int r, Real dist)
   Real d = range_ideal_len (l, r);
   Real c = range_stiffness (l, r, dist > d);
   Real block_stretch = dist - d;
+
+  if (isinf (c)) /* take care of the 0*infinity_f case */
+    return 0;
   return c * block_stretch;
 }
 
@@ -167,6 +170,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_;
 }
index 679ccfa29db3f00d2f792785a950e40be85f0b6a..c9f3afbe42a3ef4c71041b2cde980245fc283070 100644 (file)
@@ -152,5 +152,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;
 }