Расчет даты, времени, минимума, максимума и большого второстепенного тикового интервала - PullRequest
5 голосов
/ 27 декабря 2011

Я ищу хороший алгоритм для генерации хороших основных / второстепенных тиковых интервалов для оси DateTime в пользовательском компоненте построения графиков.Я прочитал этот предыдущий вопрос здесь, где обсуждается хороший способ вычисления основных / второстепенных тиков и минимальных / максимальных значений для числовой оси.Однако это трудно перевести на расчеты по оси дат.

Причина в том, что некоторые диапазоны дат находятся в разных основаниях, а другие - даже не в согласованных временных рамках.Рассмотрим диапазон оси через несколько минут.Этот расчет довольно прост, поскольку вы можете разделить минуты, используя алгоритм, аналогичный представленному выше.Однако, что вы делаете, когда одна и та же ось запрашивается для представления данных в диапазоне лет / месяцев или месяцев / недель?

Требование для этой оси состоит в том, что она может рассчитывать основные / второстепенные отметки, чтобы диаграмма никогда не была слишком загромождена, с диапазонами входных данных в миллисекундах вплоть до месяцев и лет.Он предназначен для использования на графике в реальном времени, поэтому статическое представление не так важно, как возможность быстрого обновления.Мой упрощенный алгоритм делает это:

  • Если диапазон> 3 года, выберите основной = 1 год, младший = 3 месяца
  • Если диапазон> 1 год, выберите основной = 3 месяца, младший =1 месяц
  • Если диапазон> 3 месяца, выберите основной = месяц, второстепенный = ничего (я рассматривал неделю, однако, поскольку месяц не делится на неделю, он выглядит странно)
  • Если диапазон> 1 неделявыберите основной = 1 день, младший = ничего
  • Если диапазон <1 день, выберите часы в соответствии с алгоритмом красивых чисел </li>
  • Если диапазон <1 час, выберите минуты </li>
  • Если диапазон <1 минута, выберите секунды </li>

и т. Д.

Поскольку вы можете видеть множество операторов if и возможно что-то пропустить.При таком подходе я часто сталкиваюсь с глюками в определенные даты, и мне было интересно, есть ли простой или общий способ решения этой проблемы.

С наилучшими пожеланиями, Андрей

1 Ответ

2 голосов
/ 27 декабря 2011
  1. Иметь отсортированный массив всех возможных тиков: 1 секунда, 1 минута, 1 час, 1 день, 1 месяц, 1 год.
  2. Решите, каково минимальное расстояние для большого (min_dist_major) и малого (min_dist_minor) тика.Это константы и значения в пикселях.
  3. Найдите самый маленький основной тик, который больше, чем min_dist_major, когда отображается на мониторе.
  4. Затем найдите самый маленький второстепенный тик, который меньше основного тика, но больше, чем min_dist_minor при отображении на мониторе.Если незначительный тик не может быть найден, то он не существует.

Вы можете расширить свой массив другими тиками, такими как 2 и 5 каждого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...