]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/least-squares.cc
* lily/ambitus-engraver.cc (create_ambitus): change name to
[lilypond.git] / lily / least-squares.cc
index 737cbd6d58743ffc83326504e9c490e9a2a3bc9e..bcb2cb1a9b55336df1c6cde2bf96075ca671bbe6 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1996--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1996--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 
 
 void
 minimise_least_squares (Real * coef, Real * offset,
-                       Array<Offset> input)
+                       Array<Offset> const &input)
 {
   Real sx = 0.0;
   Real sy = 0.0;
   Real sqx =0.0;
   Real sxy = 0.0;
 
-  for (int i=0; i < input.size();i++) 
+  for (int i=0; i < input.size ();i++) 
     {
       Real x=input[i][X_AXIS];
       Real y = input[i][Y_AXIS];
@@ -29,15 +29,22 @@ minimise_least_squares (Real * coef, Real * offset,
       sqx += sqr (x);
       sxy += x*y;
     }
-  int N = input.size();
+  int N = input.size ();
 
   *coef =0.0;
   *offset =0.;
   
   Real den = (N*sqx - sqr (sx));
   if (!N || !den)
-    programming_error ("minimise_least_squares():  Nothing to minimise");
-
-  *coef = (N * sxy - sx*sy)/den;
-  *offset = (sy - (*coef) * sx)/N;
+    {
+      programming_error ("minimise_least_squares ():  Nothing to minimise");
+      *coef = 0.0;
+      *offset = N ? sy/N : 0.0;
+    }
+  else
+    {
+      *coef = (N * sxy - sx*sy)/den;
+      *offset = (sy - (*coef) * sx)/N;
+    }
 }
+