Finally, I did something like this:
var fixPositions = function(range, pos, delta, strict) { var i; var leftSpaces = []; var halfDelta = strict ? delta / 2 : 0; delta = Math.min(delta, (range[1] - range[0] / (pos.length + (strict ? 0 : 1)))); // calculate all spaces that are greater than delta leftSpaces.push(Math.max(pos[0] - range[0] - halfDelta, 0)); for (i = 1; i < pos.length; i++) { leftSpaces.push(Math.max(pos[i] - pos[i-1] - delta, 0)); } leftSpaces.push(Math.max(range[1] - pos[pos.length-1] - halfDelta, 0)); // save indexes of big spaces var nonZeroSpacesIdx = []; leftSpaces.map(function(space, i) { if (space > 0) { nonZeroSpacesIdx.push(i); } }); // sort indexes by spaces sizes (start from smaller) nonZeroSpacesIdx.sort(function(a, b) { return leftSpaces[a] - leftSpaces[b]; }); // loop until spaces sum are greater than range var spacesSum = Infinity; while (nonZeroSpacesIdx.length > 0 && spacesSum > 0) { spacesSum = 0; for (i = 0; i < nonZeroSpacesIdx.length; i++) { spacesSum += leftSpaces[nonZeroSpacesIdx[i]]; } var missingDiff = (spacesSum + (pos.length - 1) * delta + halfDelta * 2) - (range[1] - range[0]); if (missingDiff <= 0) { break; } // find min diff which can be substracted from all spaces var minDiff = Math.min(missingDiff / nonZeroSpacesIdx.length, leftSpaces[nonZeroSpacesIdx[0]]); for (i = 0; i < nonZeroSpacesIdx.length; i++) { leftSpaces[nonZeroSpacesIdx[i]] -= minDiff; } // remove index of first space if its equal zero if (leftSpaces[nonZeroSpacesIdx[0]] <= 0) { nonZeroSpacesIdx.shift(); } } // reconstruct new positions var newPos = []; newPos.push(range[0] + leftSpaces[0] + halfDelta); for (i = 1; i < leftSpaces.length - 1; i++) { newPos[i] = newPos[i-1] + leftSpaces[i] + delta; } return newPos; }; // result should be from range: [5, 95] console.log(fixPositions([0, 100], [5, 6, 8, 72, 76], 10, true)); // result should be from range: [0, 100] console.log(fixPositions([0, 100], [5, 6, 8, 72, 76], 10, false));
https://jsfiddle.net/fcwu1oyu/14/
It does not give exact values ββfor my input, but it does the job for my pie charts:

source share