Вы можете сделать это следующим образом:
- Подсчитайте, сколько этикеток вы хотите иметь (
n
).Результат может иметь не так много меток, но он будет близок.У меня будет n = 6
. - Решите, какие цифры вы считаете «симпатичными».Вы хотите видеть только шаги типа 1, 2, 5, 10, 20, 50,… (в данном случае красивые цифры 1, 2 и 5) или шаги как 1, 2, 4, 5, 6, 8?10, тоже хорошо?Я собираюсь рассмотреть только 1, 2 и 5.
- Определите минимум (
min
) и максимум (max
) последовательности, остальные числа не имеют значения.(min = -3400
, max = 3790
) - Рассчитайте идеальный, но некрасивый шаг между метками как
uglyStep = (max - min) / (n - 2)
.Вычитаем два для метки внизу и вверху.(uglyStep = 1797
) - Рассчитайте порядок величины
uglyStep
как magnitude = 10 ^ floor(log10(uglyStep))
.(magnitude = 1000
) - Выберите лучший симпатичный шаг, умножив величину на все симпатичные числа и на десять.Затем выберите номер с наименьшей разницей между ним и
uglyStep
.Это будет prettyStep
.(prettyStep = 2000
) - Рассчитать положение нижней и верхней меток как
bottom = floor(min / prettyStep) * prettyStep
и top = ceil(max / prettyStep) * prettyStep
.Обратите внимание, что /
обозначает нормальное математическое деление, а не C-подобное целочисленное деление.(bottom = -4000
, top = 4000
) - Каждое число от
bottom
до top
, которое делится на prettyStep
, будет иметь метку.(-4000, -2000, 0, 2000, 4000
)
Это может потребовать некоторых модификаций, если вы не хотите, чтобы min
и max
были очень близки к bottom
и top
.
Кроме того, иногда он ведет себя несколько странно, например, для min = 0
и max = 3002
он выбирает 0, 500, 1000, 1500, 2000, 2500, 3000, 3500
, но для max = 3005
он использует 0, 1000, 2000, 3000, 4000
.