/** * 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; } export function getScaledDecimals(decimals, tick_size) { return decimals - Math.floor(Math.log(tick_size) / Math.LN10); } /** * 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; }