/** * @class Ext.chart.axis.segmenter.Numeric * @extends Ext.chart.axis.segmenter.Segmenter * * Numeric data type. */Ext.define('Ext.chart.axis.segmenter.Numeric', { extend: 'Ext.chart.axis.segmenter.Segmenter', alias: 'segmenter.numeric', isNumeric: true, renderer: function(value, context) { return value.toFixed(Math.max(0, context.majorTicks.unit.fixes)); }, diff: function(min, max, unit) { return Math.floor((max - min) / unit.scale); }, align: function(value, step, unit) { var scaledStep = unit.scale * step; return Math.floor(value / scaledStep) * scaledStep; }, add: function(value, step, unit) { return value + step * unit.scale; }, preferredStep: function(min, estStepSize) { // Getting an order of magnitude of the estStepSize with a common logarithm. var order = Math.floor(Math.log(estStepSize) * Math.LOG10E), scale = Math.pow(10, order); estStepSize /= scale; if (estStepSize < 2) { estStepSize = 2; } else if (estStepSize < 5) { estStepSize = 5; } else if (estStepSize < 10) { estStepSize = 10; order++; } return { unit: { // When passed estStepSize is less than 1, its order of magnitude // is equal to -number_of_leading_zeros in the estStepSize. fixes: -order, // Number of fractional digits. scale: scale }, step: estStepSize }; }, leadingZeros: function(n) { // For example: // leadingZeros(0.2) is 1, // leadingZeros(-0.01) is 2. return -Math.floor(Ext.Number.log10(Math.abs(n))); }, /** * Wraps the provided estimated step size of a range without altering it into a step size * object. * * @param {*} min The start point of range. * @param {*} estStepSize The estimated step size. * @return {Object} Return the step size by an object of step x unit. * @return {Number} return.step The step count of units. * @return {Object} return.unit The unit. */ exactStep: function(min, estStepSize) { var stepZeros = this.leadingZeros(estStepSize), scale = Math.pow(10, stepZeros); return { unit: { // add one decimal point if estStepSize is not a multiple of scale fixes: stepZeros + (estStepSize % scale === 0 ? 0 : 1), // Swap scale & step, if the estStepSize < 1, // or 'diff' method will give us rounding errors. scale: estStepSize < 1 ? estStepSize : 1 }, step: estStepSize < 1 ? 1 : estStepSize }; }, adjustByMajorUnit: function(step, scale, range) { var min = range[0], max = range[1], increment = step * scale, remainder, multiplier; multiplier = Math.max(1 / (min || 1), 1 / (increment || 1)); multiplier = multiplier > 1 ? multiplier : 1; remainder = ((min * multiplier) % (increment * multiplier)) / multiplier; if (remainder !== 0) { range[0] = min - remainder + (min < 0 ? -increment : 0); } multiplier = Math.max(1 / (max || 1), 1 / (increment || 1)); multiplier = multiplier > 1 ? multiplier : 1; remainder = ((max * multiplier) % (increment * multiplier)) / multiplier; if (remainder !== 0) { range[1] = max - remainder + (max > 0 ? increment : 0); } }});