Math 如何从头开始构建时间轴控件,数学,外观,感觉。。。(在C+;+;和ATL/WTL中实现)
我有一个名为DebugView++的宠物项目() 这是一个日志查看工具,我想添加一个时间线视图 这就是我到目前为止所做的: 基本上,我可以画我想要的任何东西,那部分是好的。我有一个刻度、一个光标、一个时间线和我在时间线上称之为“标志”或工件 我想做的是让它“无限”缩放,这样我可以缩小到1000px==1天或1年,放大到1000px==1微秒 问题是,如何计算缩放工件Math 如何从头开始构建时间轴控件,数学,外观,感觉。。。(在C+;+;和ATL/WTL中实现),math,graphics,open-source,timeline,Math,Graphics,Open Source,Timeline,我有一个名为DebugView++的宠物项目() 这是一个日志查看工具,我想添加一个时间线视图 这就是我到目前为止所做的: 基本上,我可以画我想要的任何东西,那部分是好的。我有一个刻度、一个光标、一个时间线和我在时间线上称之为“标志”或工件 我想做的是让它“无限”缩放,这样我可以缩小到1000px==1天或1年,放大到1000px==1微秒 问题是,如何计算缩放工件 当“时间”与“精确”像素不匹配时,最佳的取整方法是什么 在某种程度上,工件开始堆积/重叠,我必须显示一个“如果放大,这里还有更
- 当“时间”与“精确”像素不匹配时,最佳的取整方法是什么
- 在某种程度上,工件开始堆积/重叠,我必须显示一个“如果放大,这里还有更多”的工件
- 我想“放大”到当前光标
- 数据集小于当前视图大小
- 数据的粒度是任意的,有时有一个数据点,然后一个小时内什么都没有,然后是100个数据点
- 要显示的数据,在固定时间点的一组任意事件
- 时间点最早的数据点是范围的开始
- 具有最新时间点的数据点是范围的终点
- 集合可以增长,并且通常随着数据点从日志文件派生而增长
- 视图的当前范围
- 光标在视图中的位置
- 滚轮(影响缩放因子)
- 比例(不是缩放因子):时间线上的数字
- 在视图中绘制的数据点(我称之为工件)
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.111px,一些精度已经丢失了。我真的想在纳秒(或更好)内完成这项工作,因此:
我不知道从这里到哪里去。。。
这样行吗
还有关于回答设计问题,我也不知道答案:
- 如果调整窗口大小,时间线的内容是否应该更改,或者显示方式是否会更改?您是否显示更多的时间线或相同的片段,但分布在更多像素上
- 给定N个像素,主刻度的数量应该是奇数还是偶数
- 奇数似乎是一个不错的选择,因此在视图的开头和结尾总是有一个主刻度,但是当主刻度正好位于视图的第一个和最后一个像素时,该怎么办;那么你就看不清楚了,那么如何处理边缘情况呢
- 如何以“足够”的精度在电子秤上显示数字?示例:850.000us、950.000us、1.050ms现在显示在刻度上。850.000us不需要,因为精度“根本不存在”,但我无法从数字本身判断
-一月我要试着回答我自己的问题 所以首先 1) 当“时间”与“精确”像素不匹配时,最佳的取整方法是什么 如果是这种情况,只需四舍五入,那么当前的视图分辨率不足以渲染精确的表示,因此它实际上并不重要 2) 在某种程度上,工件开始堆积/重叠,我必须显示一个“如果放大,这里还有更多”的工件 这只是一个设计决策,在N个像素范围内呈现的工件将重叠。在这种情况下,您必须检测并呈现不同的工件。 这将需要在渲染之前对工件进行两次处理,以防它们未排序。(否则您将不知道尚未处理的工件是否会重叠) 3) 我想“放大”到当前光标 如果通过调整每时间单位的像素值来完成中心缩放。 然后完成“光标缩放”,调整每时间单位值的像素和时间单位偏移
。。。继续你到底有什么问题?你已经解决了缩放问题,只想对工件进行聚类吗?如果你担心亚像素舍入,你可以使用GDI+进行抗锯齿。如果你更新了问题,我的观点是,GDI没有克服亚像素问题所需的抗锯齿功能。meowgoesthedog:我明白,但这不是我的问题,在我看来,我不会依赖于子像素来绘制,只是对真实像素进行计算已经足够复杂了
datarange = 1 to 10 seconds.
viewXmin = 0px
viewXmax = 1000px
scalefactor = 1.0
unitsToPixels = 1000px / (size(datarange)) = 100px
unitsToPixels = 1000px / 9 = 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.