Используя JavaScript, на графике будет построен массив чисел (для моих целей это сплайн-диаграмма ):
[12, 22, 25, 38, 47]
Я хочу, чтобы все значения оси Y были кратны 5. У меня есть ось Y, ограниченная следующим кратным 5 , который происходит посленаибольшее число в массиве.Так как 47
является наибольшим числом, следующим кратным 5 будет 50
(назовите это значение "cap"), и это будет верхнее значение ("галочка") на оси Y диаграммы.После выяснения этого я знаю, что ось Y должна быть 0
внизу и 50
вверху, но я хочу переопределить поведение по умолчанию и точно сказать, сколько тиков между ними показывать, и чтозначения должны быть для этих тиков.
Вот где это становится сложным из-за следующих ограничений:
- Используйте наименьшее число возможных тиков (0, максимальное значение и, по крайней мере, один тик между ними)
- Нижнее значение всегда равно нулю
- Все значения тиков Y кратны 5
- Тики Y равномерно распределены по оси
В предыдущем примере пятьдесят - это ограничение, которое делится на два, поэтому оси Y потребуется только один тик вмежду нижней и верхней частями, в результате чего три значения тика 0, 25, 50
.Функция, которую я пытаюсь построить, получит 50
в качестве аргумента и выдаст 3
в качестве результата.Тогда я бы знал, что графику нужно 3 тика, и я мог бы сгенерировать его следующим образом:
У меня такой вопрос, учитывая, что отображаемое значение может бытьлюбое кратное 5, как вычислить наименьшее количество тиков, необходимое на оси Y, используя только приращения, кратные 5 ?Может быть проще всего показать первые несколько сценариев, чтобы проиллюстрировать, как шаблон не является (по крайней мере для меня) очевидным:
value = tick1, tick2, tick3, etc. >> return count of ticks
05 = 5, 4, 3, 2, 1, 0 >> return 6;// This case is an outlier and can be set manually
10 = 10, 5, 0 >> return 3;
15 = 15, 10, 5, 0 >> return 4;
20 = 20, 10, 0 >> return 3;
25 = 25, 20, 15, 10, 5, 0 >> return 6;
30 = 30, 15, 0 >> return 3;
35 = 35, 30, 25, 20, 15, 10, 5, 0 >> return 8;
40 = 40, 20, 0 >> return 3;
45 = 45, 30, 15, 0 >> return 4;
50 = 50, 25, 0 >> return 3;
55 = 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0 >> return 12;
Именно в этот момент я понял, что, вероятно, существует уравнение или функциякоторая существует для решения этой дилеммы, может быть, даже что-то связанное с последовательностью Фибоначчи или Дэном БрауномЯ не смог найти связанных с этим вопросов SO, и мое использование "приращений 5" может сделать этот вариант использования слишком конкретным, чтобы возвращать результаты Google по общему принципу, поэтому любые советы приветствуются.