【问题标题】:How to build a timeline control from scratch, the math, looks, feel... (implementing in C++ and ATL/WTL)如何从头开始构建时间线控件,数学、外观、感觉...(在 C++ 和 ATL/WTL 中实现)
【发布时间】:2019-02-08 22:03:35
【问题描述】:

我有一个名为 DebugView++ (https://github.com/CobaltFusion/DebugViewPP) 的宠物项目

这是一个日志查看工具,我想为其添加时间线视图。

这是我目前所拥有的:

基本上,我可以画任何我想要的,那部分没问题。我有一个刻度、一个光标、一个时间轴和“标志”或我在时间轴上调用它们的工件。

我想做的是让它“无限”缩放,这样我就可以缩小到 1000px == 1 天或 1 年,然后放大到 1000px == 1 微秒。

问题是,如何对缩放工件进行数学计算。

  • 当“时间”与“精确”像素不匹配时,最好的舍入方法是什么。
  • 在某种程度上,工件开始堆积/重叠,我将不得不显示“如果放大,这里还有更多”之类的工件。
  • 我想“放大”到当前光标

我真的可以使用一些帮助来设置它,我真的很头疼 仅对所有边缘情况都“不起作用”的计算,从某种意义上说,在以下情况下结果令人不快:

  • 数据集小于当前视图大小
  • 数据的粒度是任意的,有时有一个数据点,然后一个小时什么都没有,然后是第 100 个数据点

我在图形渲染方面的经验很少; 有没有人有关于如何“思考”这样一个时间线的渲染的提示。在我看来,UI 人员已经解决了这个问题(而且要复杂得多),所以我不想重新发明轮子。

尼科> 我还没有解决缩放问题,缩放/缩放/定位的数学是我的主要问题。首先,我不确定是使用离散数学还是浮点数学。

我有几个输入:

  • 要显示的数据,一组固定时间点的任意事件。
  • 时间点最早的数据点是范围的开始。
  • 时间点最新的数据点是范围的结尾。
  • 集合可以增长,并且通常随着数据点从日志文件中派生而增长
  • 视图的当前范围
  • 光标在视图中的位置
  • 滚轮(影响缩放系数)

和输出:

  • 比例(不是缩放因子):时间轴上的数字
  • 在视图中绘制的数据点(我称之为工件)

假设当前数据集是(以秒为单位)

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

绘制标志的位置 = unitsToPixels * timeInSeconds

所以这里 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,因为精度“不存在”,但我无法从数字本身看出这一点。

名单还在继续……

还有一件事:除了像素精确之外,它也很丑陋,基本上我希望它看起来不错并且对用户友好,但我不知道如何实现这一点.. 任何 ui 设计师有任何提示吗?

喵喵狗> 它与 GDI 无关,这部分工作正常。

-一月。

【问题讨论】:

  • 您遇到的问题到底是什么?您是否解决了缩放问题并且只想对工件进行聚类?
  • 如果您担心亚像素舍入,您可以使用 GDI+ 和抗锯齿。
  • 如果有更新问题
  • 我的意思是,GDI 不具备克服亚像素问题所需的抗锯齿功能。
  • meowgoesthedog:我明白,但这不是我的问题,我看它的方式,我不会依赖子像素来绘制,只是对真实像素进行计算是够复杂的

标签: math graphics open-source timeline


【解决方案1】:

我将尝试回答我自己的问题。

首先。

1) 当“时间”与“精确”像素不匹配时,最好的舍入方法是什么。

只是向下取整,如果是这种情况,那么当前视图分辨率不足以呈现准确的表示,所以真的没关系。

2) 在某种程度上,工件开始堆积/重叠,我将不得不显示“如果放大,这里还有更多”的工件。

这只是一个设计决定,在彼此 N 个像素内渲染的工件将重叠。在这种情况下,您必须检测到这一点并呈现不同的工件。 这将需要在渲染之前对工件进行两次处理,以防它们未排序。 (否则你将不知道尚未处理的工件是否会重叠)

3) 我想“放大”到当前光标

如果通过调整像素/时间单位值来完成中心缩放。 然后“光标缩放”完成调整每个时间单位的像素值和时间单位偏移量

...待续

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2015-07-07
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多