Math 如何从头开始构建时间轴控件,数学,外观,感觉。。。(在C+;+;和ATL/WTL中实现)

Math 如何从头开始构建时间轴控件,数学,外观,感觉。。。(在C+;+;和ATL/WTL中实现),math,graphics,open-source,timeline,Math,Graphics,Open Source,Timeline,我有一个名为DebugView++的宠物项目() 这是一个日志查看工具,我想添加一个时间线视图 这就是我到目前为止所做的: 基本上,我可以画我想要的任何东西,那部分是好的。我有一个刻度、一个光标、一个时间线和我在时间线上称之为“标志”或工件 我想做的是让它“无限”缩放,这样我可以缩小到1000px==1天或1年,放大到1000px==1微秒 问题是,如何计算缩放工件 当“时间”与“精确”像素不匹配时,最佳的取整方法是什么 在某种程度上,工件开始堆积/重叠,我必须显示一个“如果放大,这里还有更

我有一个名为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不需要,因为精度“根本不存在”,但我无法从数字本身判断
名单还在继续

还有一件事:除了像素精确外,它也很难看,基本上我希望它看起来很漂亮,并且对用户友好,但我不知道如何做到这一点。。用户界面设计师有什么建议吗

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


-一月

我要试着回答我自己的问题

所以首先

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.