Как создать элемент управления временной шкалы с нуля, математика, внешний вид, чувства ... (реализация на C ++ и ATL / WTL) - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть домашний проект DebugView ++ (https://github.com/CobaltFusion/DebugViewPP)

)

Это инструмент просмотра журналов, и я хочу добавить к нему шкалу времени.

Это то, что я имею до сих пор:

this is what I have so far

В принципе, я могу рисовать то, что хочу, эта часть в порядке. У меня есть шкала, курсор, временная шкала и «флаги» или артефакты, как я их называю на временной шкале.

Что я хочу сделать, так это сделать его «бесконечно» масштабируемым, чтобы я мог уменьшить масштаб до 1000px == 1 день или 1 год и увеличить до 1000px == 1 мкс.

Проблема в том, как сделать математику при масштабировании артефактов.

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

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

  • набор данных меньше текущего размера представления
  • детализация данных произвольна, иногда есть точка данных, затем ничего в течение часа, а затем сотые точки данных

У меня очень мало опыта в рендеринге графики; У кого-нибудь есть советы о том, как «думать» о рендеринге такой временной шкалы. Для меня это звучит так, как будто пользовательский интерфейс решил эту проблему (и гораздо более сложную), поэтому я не хочу заново изобретать колесо.

Nico> Я не решил масштабирование, математика для масштабирования / масштабирования / позиционирования - моя главная проблема. во-первых, я не уверен, использовать ли дискретную математику или математику с плавающей запятой.

У меня есть несколько входов:

  • данные для отображения, набор произвольных событий в фиксированные моменты времени.
  • точка данных с самым ранним моментом времени является началом диапазона.
  • точка данных с самым последним моментом времени является концом диапазона.
  • набор может расти и, как правило, увеличивается, поскольку точки данных получены из файла журнала
  • текущий диапазон просмотра
  • положение курсора в представлении
  • колесо прокрутки (влияет на коэффициент масштабирования)

и выходы:

  • шкала (не коэффициент масштабирования): цифры на временной шкале
  • точки данных (я называю их артефактами), нарисованные на виде

предположим, что текущий набор данных (в секундах)

1:  red flag
3:  red flag
5:  red flag
7:  red flag
10: red flag

С этого я и начинаю:

datarange = 1 to 10 seconds.
viewXmin = 0px
viewXmax = 1000px
scalefactor = 1.0 

unitsToPixels = 1000px / (size(datarange)) = 100px
unitsToPixels = 1000px / 9 = 111.111111111px

флажок для рисования = единицы измеренияПиксели * время в секундах

Так что здесь уже есть некоторая неточность 111.111111111px, некоторая точность там была потеряна. Я действительно хочу сделать это в наносекундах (или лучше), так:

unitsToPixels = 1000px / 9e-9) = 1.111111111e-7px

pos to draw flag = unitsToPixels * timeInSeconds
pos to draw flag = 1.111111111e-7px* 5e-9 = 555.555555px. 

Я не уверен, куда идти отсюда ... Это нормально?

Также об ответах на вопросы дизайна. Я тоже не знаю ответа:

  • должно ли меняться содержимое временной шкалы, если вы изменяете размер окна или изменяется способ отображения? Вы отображаете больше временной шкалы или ту же часть, но распределяете по большему количеству пикселей?
  • учитывая N пикселей, должно ли количество основных тиков быть нечетным или четным?
  • odd кажется хорошим выбором, поэтому в начале и в конце представления всегда есть основной тик, но что делать, если основной тик находится точно в первом и последнем пикселях представления; тогда вы не сможете увидеть это ясно, так как обращаться с краем дела.
  • как отображать числа на шкале с «достаточной» точностью? Например: 850.000US, 950.000US, 1.050ms теперь отображается в масштабе. 850.000us не нужно, потому что точность «просто нет», но я не могу сказать это по самому числу.

Список можно продолжить ...

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

Meowgoesthedog> Дело не в GDI, что эта часть работает нормально.

-январь.

1 Ответ

0 голосов
/ 12 сентября 2018

Я попытаюсь ответить на свой вопрос.

Итак, прежде всего.

1) как лучше округлить, когда «время» не соответствует «точному» пикселю.

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

2) на каком-то уровне артефакты начинают накапливаться / перекрываться, и мне придется отобразить «есть еще что-то, если вы увеличите» вид артефакта.

Это всего лишь проектное решение, артефакт, который отображается в пределах N пикселей друг от друга, будет перекрываться. Вы должны обнаружить это и визуализировать другой артефакт в этом случае. Это потребует обработки артефактов дважды перед рендерингом, если они не отсортированы. (иначе вы не будете знать, будет ли перекрываться еще не обработанный артефакт)

3) Я хочу увеличить текущий курсор

, если масштабирование по центру выполняется путем регулировки значения пикселов на единицу времени. Затем выполняется 'zoom-zoom', регулируя значение в пикселях на единицу времени И смещение на единицу времени

... продолжение следует

...