Histograms: Fix the alignment case where little slack exists on either side of the...
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 27 Mar 2012 19:28:27 +0000 (21:28 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 28 Mar 2012 07:28:47 +0000 (09:28 +0200)
src/math/histogram.c

index ca2d9d7d20f1d93517bbaa71e2f36f7f9aa54791..7fc2d08e3de341a49455e0395d7283e204384f79 100644 (file)
@@ -140,29 +140,43 @@ adjust_bin_ranges (double bin_width, double min, double max, double *adj_min, do
   */
   if ( lower_limit % 2 == 0)
     {
-      if (upper_slack > lower_slack && upper_slack > half_bin_width)
+      /* If there is not enough slack at either end to perform a shift,
+         then we must extend the range so that there is.  We must extend
+         by two half bin widths in order to preserve the EVEN condition
+         established above.  Also, we extend on the end with the least
+         slack, in order to keep things as balanced as possible. */
+      if ( upper_slack > lower_slack && upper_slack <= half_bin_width)
         {
+          lower_limit -= 2;
+          lower_slack += 2 * half_bin_width;
+        }
+           
+      if (lower_slack > upper_slack && lower_slack < half_bin_width)
+        {
+          upper_limit += 2;
+          upper_slack += 2 * half_bin_width;
+        }
+
+      if (upper_slack > lower_slack)
+        {
+          assert (upper_slack > half_bin_width);
+
           /* Adjust the range to the left */
           lower_limit --;
           upper_limit --;
           upper_slack -= half_bin_width;
           lower_slack += half_bin_width;
         }
-      else if (lower_slack > upper_slack && lower_slack >= half_bin_width)
+      else
         {
+          assert (lower_slack >= half_bin_width);
+
           /* Adjust the range to the right */
           lower_limit ++;
           upper_limit ++;
           lower_slack -= half_bin_width;
           upper_slack += half_bin_width;
         }
-      else
-        {
-          /* In this case, we cannot adjust in either direction.
-             To get the most pleasing alignment, we would have to change
-             the bin width (which would have other visual disadvantages).
-          */
-        }
     }
 
   /* If there are any completely empty bins, then remove them,