0

我不知道如何用更少的词来表达我需要的算法的作用;很有可能这里已经回答了这样的问题,但我不知道如何搜索它。

我需要的是以下内容。
我正在编写一种 2D 图形绘图程序。显然,只画主坐标线不是很好,因为图形可能离原点很远,如果只画主线,用户对它的大小没有任何参考。
我决定绘制参考线,即以恒定间隔周期性出现的水平线和垂直线,对应于例如整数。然而,使用固定间隔的效果并不好,因为有缩放的可能性,也就是说,如果用户放大查看例如单位正方形的内部,他将再次看到几乎空的盒子,而没有任何尺寸参考。

所以,我需要以某种方式重新调整用于绘制参考线的间隔。换句话说,我需要一个类型的函数,double -> double它接受当前比例系数(我使用的那个指定一个长度单位中有多少像素)或应用于它的某个函数的值(例如,可以沿某个轴适合屏幕内部)并返回 step 值(以像素为单位,以逻辑单位表示,无所谓),即参考线之间的间隔长度。

我相信这种函数的值集是可数无限的,也就是说,这个函数会将比例系数值的区间映射到步长的固定值。我可以对算法进行粗略的描述,或者更准确地说,是我需要的映射。它看起来与此类似(输入值是屏幕内的最大单位数):

  • ...
  • [5..9] -> 0.25
  • [9..15] -> 0.5
  • [15..30] -> 1
  • ...

这里的值纯粹是经验值,仅用于说明。

但是,我不知道如何将这组映射外推到更广泛的比例系数值,更不用说如何分析地表达这种依赖关系了。然而我确信这是可能的,因为我在许多绘图程序中都看到了这样的事情。

我发现这个问题看起来非常接近我的需要,但我无法将答案调整到我的任务中,因为它提到了标签宽度并且我没有任何标签。

4

1 回答 1

1

您可以将其精确定义为一个数量级(十次方),然后类似地处理其他数量级并转换回来,例如

double tickStep(double pixelDistance)
{
     if(pixelDistance <= 3.0)
       return(tickStep(pixelDistance * 10.0) / 10.0);
     else if(pixelDistance > 3.0 && pixelDistance <= 5.0)
        return(0.125);
     else if(pixelDistance > 5.0 && pixelDistance <= 9.0)
        return(0.25);
     else if(pixelDistance > 9.0 && pixelDistance <= 15.0)
        return(0.5);
     else if(pixelDistance > 15.0 && pixelDistance <= 30.0)
        return(1.0);
     else if(pixelDistance > 30.0)
        return(tickStep(pixelDistance / 10.0) * 10.0);
}

我已经使用递归来阐明这个想法,但使用logand可能更有效pow

于 2013-01-22T23:23:36.220 回答