首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >图形轴的刻度线算法

图形轴的刻度线算法
EN

Stack Overflow用户
提问于 2008-10-25 23:54:36
回答 3查看 18.7K关注 0票数 27

我正在寻找一种算法,可以将刻度线放置在轴上,给定要显示的范围,显示刻度线的宽度,以及测量刻度线的字符串宽度的函数。

例如,假设我需要在1e-6和5e-6之间显示,以及要以像素为单位显示的宽度,算法将确定我应该在1e-6、2e-6、3e-6、4e-6和5e-6处放置刻度线(例如)。给定较小的宽度,它可能会决定最佳位置仅在偶数位置,即2e-6和4e-6 (因为放置更多的刻度线会导致它们重叠)。

智能算法将优先选择10、5和2的倍数的刻度线。此外,智能算法将在零附近对称。

EN

回答 3

Stack Overflow用户

发布于 2008-10-27 04:09:02

取最长的约为0的线段(如果0不在该范围内,则取整个图)-例如,如果您的范围是-5,1,则取-5,0。

以滴答为单位,计算出此数据段的大致长度。这只是长度除以刻度的宽度。所以假设这个方法说我们可以把11个刻度放在-5到0之间。这是我们的上限。对于较短的一侧,我们将只在较长的一侧镜像结果。

现在尝试放入尽可能多(最多11个)的刻度,每个刻度的标记形式为i*10*10^n,i*5*10^n,i*2*10^n,其中n是整数,i是刻度的索引。现在这是一个优化问题-我们希望最大化我们可以放入的刻度数,同时最小化最后一个刻度和结果结束之间的距离。因此,为获得尽可能多的刻度分配一个分数,小于我们的上限,并分配一个分数,使最后一个刻度接近n-你必须在这里进行实验。

在上面的例子中,尝试n= 1。我们得到1tick(在i=0)。N=2给我们1个刻度,我们离下限更远,所以我们知道我们必须走另一条路。N=0给我们6个刻度,在每个整数点上。N= -1给我们12个刻度(0,-0.5,...,-5.0)。N= -2表示24个刻度,依此类推。评分算法将给他们每个人一个分数-越高意味着更好的方法。

对i*5* 10^n和i*2*10^n再次执行此操作,并取得分最高的那个。

(作为评分算法的示例,假设得分是到最后一次刻度的距离乘以最大刻度数减去所需数量。这可能会很糟糕,但它将作为一个良好的起点)。

票数 2
EN

Stack Overflow用户

发布于 2008-10-27 05:43:06

我一直在使用jQuery flot图形库。它是开源的,可以很好地生成轴/刻度。我建议看看它的代码,并从中提取一些想法。

票数 1
EN

Stack Overflow用户

发布于 2017-03-04 16:19:52

这个简单的算法产生的间隔是10的幂的1、2或5的倍数,并且轴范围被划分为至少5个间隔。代码示例使用java语言编写:

代码语言:javascript
复制
protected double calculateInterval(double range) {
    double x = Math.pow(10.0, Math.floor(Math.log10(range)));
    if (range / x >= 5)
        return x;
    else if (range / (x / 2.0) >= 5)
        return x / 2.0;
    else
        return x / 5.0;
}

这是另一种选择,间隔至少为10次:

代码语言:javascript
复制
protected double calculateInterval(double range) {
    double x = Math.pow(10.0, Math.floor(Math.log10(range)));
    if (range / (x / 2.0) >= 10)
        return x / 2.0;
    else if (range / (x / 5.0) >= 10)
        return x / 5.0;
    else
        return x / 10.0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/237220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档