in src/visual.ts [1384:1446]
private getXPoints(): number[] {
const { start, end } = this.data.settings.xAxis,
{ minX, maxX } = this.data.borderValues,
{ dataPoints } = this.data,
interval: number = this.data.dataPoints[0].x1 - this.data.dataPoints[0].x0;
let xPoints: number[],
tmpStart: number,
tmpEnd: number,
tmpArr: number[],
closerLimit: number;
xPoints = dataPoints.reduce(
(previousValue: number[], currentValue: HistogramDataPoint, index: number) =>
previousValue.concat((index === 0)
? currentValue.range
: currentValue.range.slice(1)),
[]
);
// It is necessary to find out interval to calculate all necessary points before and after offset (if start and end for X axis was changed by user)
if ((maxX !== end || minX !== start) && xPoints.length > 1) {
// The interval must be greater than zero to avoid infinity loops
if (Visual.isIntervalValid(interval)) {
// If start point is greater than min border, it is necessary to remove non-using data points
if (start > minX) {
closerLimit = this.findBorderMinCloserToXAxisStart(minX, start, interval);
xPoints = xPoints.filter(dpv => this.formatXLabelsForFiltering(dpv) >= closerLimit);
this.data.xCorrectedMin = xPoints && xPoints.length > 0 ? xPoints[0] : null;
}
else {
// Add points before
tmpArr = [];
tmpStart = minX;
while (start < tmpStart) {
tmpStart = tmpStart - interval;
tmpArr.push(tmpStart);
this.data.xCorrectedMin = tmpStart;
}
tmpArr.reverse();
xPoints = tmpArr.concat(xPoints);
}
// If end point is lesser than max border, it is necessary to remove non-using data points
if (end < maxX) {
closerLimit = this.findBorderMaxCloserToXAxisEnd(maxX, end, interval);
xPoints = xPoints.filter(dpv => this.formatXLabelsForFiltering(dpv) <= closerLimit);
this.data.xCorrectedMax = xPoints && xPoints.length > 0 ? xPoints[xPoints.length - 1] : null;
}
else {
// Add points after
tmpEnd = maxX;
while (end > tmpEnd) {
tmpEnd = tmpEnd + interval;
xPoints.push(tmpEnd);
this.data.xCorrectedMax = tmpEnd;
}
}
}
}
return xPoints;
}