1

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

所以根据可用的宽度,我想画尽可能多的刻度。但它们不应该靠得太近。它们应该至少相隔一定数量的像素。

因此,当您放大刻度时,刻度显然会分开,但在某个阈值时,一旦限制允许绘制新刻度,旧刻度之间就会出现新刻度。

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

4

2 回答 2

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)))
于 2009-11-29T11:58:12.017 回答
1

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

首先决定在滴答之间应该允许什么间隔。由于时间系统的疯狂(以 10 为底?以 60 为底?一个月有多长?)没有特别好的算法来生成此列表 - 只需选择人们熟悉的自然间隔并将其硬编码到您的程序中:

...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...

然后给定一个特定的轴宽度和一个要显示的特定时间间隔,只需遍历您的列表,计算它将产生多少个刻度以及如果您使用该比例,刻度将以像素为单位的接近程度。这个计算可以使用简单的除法来完成。在刻度不要靠得太近的情况下,选择刻度数最多的刻度。这种简单的算法应该提供完全足够的性能,但是如果您希望优化它,您可以使用二进制搜索而不是迭代整个列表(尽管可能不值得付出努力)。

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

于 2009-11-26T23:47:38.387 回答