Один из способов сделать это - «нормализовать» разницу между минимумом и максимумом и провести различие в регистре для этого значения. В питоне:
delta = maximum - minimum
factor = 10**math.ceil(math.log(delta,10)) # smallest power of 10 greater than delta
normalised_delta = delta / factor # 0.1 <= normalised_delta < 1
if normalised_delta/5 >= 0.1:
step_size = 0.1
elif normalised_delta/5 >= 0.05:
step_size = 0.05
elif normalised_delta/20 <= 0.01:
step_size = 0.01
step_size = step_size * factor
Приведенный выше код предполагает, что вы хотите максимально возможный разрыв. Для самых маленьких вы должны использовать следующее, если:
if normalised_delta/20 == 0.005:
step_size = 0.005
elif normalised_delta/20 <= 0.01:
step_size = 0.01
elif normalised_delta/5 >= 0.05:
step_size = 0.05
Помимо возможности того, что существует более одного подходящего значения, существует также несколько тревожная возможность того, что их нет. Возьмем, к примеру, диапазон [0,24], где разрыв 12,5p даст размер шага 1,2, а разрыв 50p даст размер шага 4,8. Между ними нет ни «единицы», ни «половины единицы». Проблема заключается в том, что разница между пропуском 12,5p и одним из 50p является фактором 4, а разница между 0,01 и 0,05 - фактором 5. Таким образом, вам придется немного расширить диапазон допустимых пропусков и соответствующим образом изменить код .
Разъяснение некоторых магических чисел: деления на 20 и 5 соответствуют количеству сегментов с минимальным и максимальным размером зазора соответственно (т. Е. 250 / 12,5 и 250/50). Поскольку нормализованная дельта находится в диапазоне [0,1,1), вы получите, что, поделив ее на 20 и 5, вы получите [0,005,05) и [0,02,0,2) соответственно. Эти диапазоны приводят к возможным (нормализованным) размерам шагов 0,005 и 0,01 для первого диапазона и 0,05 и 0,1 для второго.