Возьмите самый длинный из сегментов около нуля (или весь график, если ноль не находится в диапазоне) - например, если у вас есть что-то в диапазоне [-5, 1], возьмите [-5,0] .
Приблизительно выясните, как долго будет длиться этот сегмент в тиках. Это просто деление длины на ширину галочки. Итак, предположим, что метод говорит, что мы можем поставить 11 тиков от -5 до 0. Это наша верхняя граница. Для более короткой стороны мы просто отразим результат на более длинной стороне.
Теперь попробуйте ввести как можно больше (до 11) тиков, чтобы маркер для каждого тика имел вид i * 10 * 10 ^ n, i * 5 * 10 ^ n, i * 2 * 10 ^ n, где n - целое число, а i - индекс тика. Теперь это проблема оптимизации - мы хотим максимизировать количество тиков, которые мы можем вставить, и в то же время минимизировать расстояние между последним тиком и концом результата. Поэтому присвойте балл, чтобы получить как можно больше тиков, меньше нашей верхней границы, и назначьте балл, чтобы последний тик был близок к n - вам придется экспериментировать здесь.
В приведенном выше примере попробуйте n = 1. Мы получаем 1 тик (при i = 0). n = 2 дает нам 1 тик, и мы дальше от нижней границы, поэтому мы знаем, что должны идти другим путем. n = 0 дает нам 6 тиков в каждой целочисленной точке. n = -1 дает нам 12 тиков (0, -0,5, ..., -5,0). n = -2 дает нам 24 тика и так далее. Алгоритм оценки даст каждому из них балл - чем выше, тем лучше метод.
Сделайте это снова для i * 5 * 10 ^ n и i * 2 * 10 ^ n, и возьмите тот, у которого лучший результат.
(в качестве примера алгоритма подсчета скажем, что счет - это расстояние до последнего такта, умноженное на максимальное количество тактов минус необходимое количество. Это, вероятно, будет плохо, но послужит хорошей отправной точкой).