我正在创建一个时间轴,我想在某个时间步长绘制刻度线。
因此,根据可用的宽度,我想绘制尽可能多的刻度。但他们不应该太靠近。它们应至少保持一定的像素数。
因此,当你放大时,蜱显然会分开,但是在某个阈值处,一旦限制允许新的剔除,就会在旧的蜱之间出现新的蜱。
那么如何根据缩放和宽度找到刻度线之间的空间?
答案 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...
然后给定一个特定的轴宽度和一个特定的时间间隔来显示,只需迭代你的列表计算它将产生多少刻度以及如果使用该刻度,刻度将以像素为单位的接近程度。使用简单除法进行该计算。选择具有最大蜱数的比例,条件是蜱不要太近。这个天真的算法应该提供完全足够的性能,但如果你想优化它,你可以使用二进制搜索而不是迭代整个列表(虽然可能不值得努力)。
这有点烦人,但我不知道更好的方法,除非你能找到一些能为你做这件事的图书馆。我不知道任何提供此功能的库,但必须有大量的开源项目做类似的事情,如果你不想自己编写代码,你可以从中获取代码。