Алгоритм автомасштабирования линейки в графическом компоненте графопостроителя - PullRequest
3 голосов
/ 25 января 2012

Я разрабатываю (не программирую) программу просмотра ряда данных для медицинских данных, используя C # / WPF.Существует одна основная панель, на которой отображаются данные, с общей функциональностью панорамирования / масштабирования мыши (панорамирование с перетаскиванием влево, горизонтальное масштабирование с прокруткой, автоматическая подгонка по вертикали с двойным щелчком, выделение при перетаскивании вправо).

проблема в том, что мне нужна вертикальная и горизонтальная сетка с линейками сверху / слева, аналогичные тем, которые можно увидеть в программах редактирования аудио (goldwave, audacity), картографии (gpsTrackmaker) и ilustration (photoshop, inkscape).Кроме того, эти линейки можно настраивать даже в большинстве API для построения графиков (Matlab, GNUPlot, Matplotlib) и даже в офисных программах (Excel, Calc).

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

Ниже приведено изображение, показывающее два уровня масштабирования одного и того же чертежа в Inkscape.Первый ряд показывает каждую сотню ярлыков.Во второй строке показываются метки каждого десятилетия.

Вопрос заключается в следующем: «Поскольку это (автоматическое разрешение линеек просмотра) кажется решенной проблемой во многих программах, как мне искать / какие доступныресурсы / учебные пособия, чтобы я мог указать и реализовать такой элемент управления, который соответствует моим потребностям? "

Буду признателен за любые предложения или примеры, желательно на C #, но может быть на любом языке.

enter image description here

1 Ответ

4 голосов
/ 06 сентября 2012
  • W = видимый выступ линейки
  • X = диапазон (справа налево), представленный W
  • w = ширина этикетки

n = W/w (максимальное количество меток, которое вы можете отобразить)

x = X*w/W (минимальный диапазон между двумя метками)

Затем необходимо округлить x до большего, более холодного значения 1, 2 или 5в любой величине.

Например

  • x=18.4 => x1=20
  • x=539 => x1=1000

w1 = x1/X*W (ширина метки или расстояние между галочками)

n1 = W/w1 (количество галочек)

...