在可缩放的时间轴上绘制刻度线

时间:2009-11-26 23:13:21

标签: paint timeline timelinemarkers

我正在创建一个时间轴,我想在某个时间步长绘制刻度线。

因此,根据可用的宽度,我想绘制尽可能多的刻度。但他们不应该太靠近。它们应至少保持一定的像素数。

因此,当你放大时,蜱显然会分开,但是在某个阈值处,一旦限制允许新的剔除,就会在旧的蜱之间出现新的蜱。

那么如何根据缩放和宽度找到刻度线之间的空间?

2 个答案:

答案 0 :(得分:3)

在我第一次回答之后,你澄清了你的规格,问题变得比我想象的要简单。您还想要一个比我之前提供的一般解决方案更简单的解决方案。我不是编辑原始评论,而是创建一个新评论,因为这是一种完全不同的方法。

首先定义有趣的变量:

minimumPixelsBetweenTicks = 5
axisWidthPixels = 400
axisRangeTime = 1000.0         # = axisMaximumTime - axisMinimumTime
tickSeparationTime = 10 ** e   # e is an unknown integer that we must find

然后你可以使用下面的公式直接计算e(你没有指定语言,所以我使用的是Python):

e = int(math.ceil(math.log(minimumPixelsBetweenTicks * axisRange / axisWidthPixels, 10)))

答案 1 :(得分:1)

这有点乱,但它很简单,效果很好:

首先确定刻度之间应该允许的间隔。由于时间系统的疯狂(基数10?基数60?一个月多长时间?),没有特别好的算法来生成这个列表 - 只需选择人们熟悉的自然区间并将其硬编码到程序中: / p>

...etc...
every 0.1 second
every 1 second
every 5 seconds
every 15 seconds
every 1 minute
every 5 minutes
every 15 minutes
every 1 hours
every 2 hours
every 4 hours
every 8 hours
every day, midnight
every 7 days, midnight
every month start
every quarter start
every year start
every 10 years
...etc...

然后给定一个特定的轴宽度和一个特定的时间间隔来显示,只需迭代你的列表计算它将产生多少刻度以及如果使用该刻度,刻度将以像素为单位的接近程度。使用简单除法进行该计算。选择具有最大蜱数的比例,条件是蜱不要太近。这个天真的算法应该提供完全足够的性能,但如果你想优化它,你可以使用二进制搜索而不是迭代整个列表(虽然可能不值得努力)。

这有点烦人,但我不知道更好的方法,除非你能找到一些能为你做这件事的图书馆。我不知道任何提供此功能的库,但必须有大量的开源项目做类似的事情,如果你不想自己编写代码,你可以从中获取代码。