2017-04-07 03:07:30 -05:00
|
|
|
/**
|
|
|
|
* Calculate tick step.
|
|
|
|
* Implementation from d3-array (ticks.js)
|
|
|
|
* https://github.com/d3/d3-array/blob/master/src/ticks.js
|
|
|
|
* @param start Start value
|
|
|
|
* @param stop End value
|
|
|
|
* @param count Ticks count
|
|
|
|
*/
|
|
|
|
export function tickStep(start: number, stop: number, count: number): number {
|
|
|
|
let e10 = Math.sqrt(50),
|
|
|
|
e5 = Math.sqrt(10),
|
|
|
|
e2 = Math.sqrt(2);
|
|
|
|
|
|
|
|
let step0 = Math.abs(stop - start) / Math.max(0, count),
|
|
|
|
step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
|
|
|
|
error = step0 / step1;
|
|
|
|
|
|
|
|
if (error >= e10) {
|
|
|
|
step1 *= 10;
|
|
|
|
} else if (error >= e5) {
|
|
|
|
step1 *= 5;
|
|
|
|
} else if (error >= e2) {
|
|
|
|
step1 *= 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
return stop < start ? -step1 : step1;
|
|
|
|
}
|
2017-06-27 05:13:50 -05:00
|
|
|
|
|
|
|
export function getScaledDecimals(decimals, tick_size) {
|
|
|
|
return decimals - Math.floor(Math.log(tick_size) / Math.LN10);
|
|
|
|
}
|
2017-06-27 05:59:54 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Calculate tick size based on min and max values, number of ticks and precision.
|
|
|
|
* @param min Axis minimum
|
|
|
|
* @param max Axis maximum
|
|
|
|
* @param noTicks Number of ticks
|
|
|
|
* @param tickDecimals Tick decimal precision
|
|
|
|
*/
|
|
|
|
export function getFlotTickSize(min: number, max: number, noTicks: number, tickDecimals: number) {
|
|
|
|
var delta = (max - min) / noTicks,
|
|
|
|
dec = -Math.floor(Math.log(delta) / Math.LN10),
|
|
|
|
maxDec = tickDecimals;
|
|
|
|
|
|
|
|
var magn = Math.pow(10, -dec),
|
|
|
|
norm = delta / magn, // norm is between 1.0 and 10.0
|
|
|
|
size;
|
|
|
|
|
|
|
|
if (norm < 1.5) {
|
|
|
|
size = 1;
|
|
|
|
} else if (norm < 3) {
|
|
|
|
size = 2;
|
|
|
|
// special case for 2.5, requires an extra decimal
|
|
|
|
if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
|
|
|
|
size = 2.5;
|
|
|
|
++dec;
|
|
|
|
}
|
|
|
|
} else if (norm < 7.5) {
|
|
|
|
size = 5;
|
|
|
|
} else {
|
|
|
|
size = 10;
|
|
|
|
}
|
|
|
|
|
|
|
|
size *= magn;
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|