【发布时间】: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