var kmg2 = opts("labelsKMG2");
var mults, base;
if (kmg2) {
- mults = [1, 2, 4, 8, 16];
+ mults = [1, 2, 4, 8, 16, 32, 64, 128, 256];
base = 16;
} else {
- mults = [1, 2, 5, 10];
+ mults = [1, 2, 5, 10, 20, 50, 100];
base = 10;
}
- var wanted_ticks = pixels / pixels_per_tick;
- var units_per_tick = Math.abs(b - a) / wanted_ticks;
+ // Get the maximum number of permitted ticks based on the
+ // graph's pixel size and pixels_per_tick setting.
+ var max_ticks = Math.ceil(pixels / pixels_per_tick);
+
+ // Now calculate the data unit equivalent of this tick spacing.
+ // Use abs() since graphs may have a reversed Y axis.
+ var units_per_tick = Math.abs(b - a) / max_ticks;
+
+ // Based on this, get a starting scale which is the largest
+ // integer power of the chosen base (10 or 16) that still remains
+ // below the requested pixels_per_tick spacing.
var base_power = Math.floor(Math.log(units_per_tick) / Math.log(base));
var base_scale = Math.pow(base, base_power);
+
+ // Now try multiples of the starting scale until we find one
+ // that results in tick marks spaced sufficiently far apart.
+ // The "mults" array should cover the range 1 .. base^2 to
+ // adjust for rounding and edge effects.
var scale, low_val, high_val, nTicks, spacing;
for (j = 0; j < mults.length; j++) {
scale = base_scale * mults[j];