我不知道如何用更少的文字表述我需要的算法的作用;很可能这里已经回答了这样的问题,但我不知道如何搜索它。
我需要的是以下内容。
我正在编写一种二维图形绘图程序。显然,只画主坐标线效果不是很好,因为图形可以远离原点,如果只画主坐标线,用户对其尺寸没有任何引用。
我决定绘制引用线,即以恒定间隔周期性出现的水平线和垂直线,对应于例如整数。然而,由于缩放的可能性,使用恒定间隔并不能很好地工作,也就是说,如果用户放大查看单位正方形的内部,他将再次看到几乎是空的盒子,没有任何尺寸引用。
因此,我需要以某种方式重新调整用于绘制引用线的间隔。换句话说,我需要一个类型为 double -> double
的函数,它接受当前比例系数(我使用的那个指定一个长度单位中有多少像素)或应用的某个函数的值到它(例如,可以沿某个轴在屏幕内容纳的最大单位长度数)并返回步长值(以像素为单位,以逻辑单位为单位,无关紧要),即引用线之间的间隔长度。
我相信此类函数的值集将是可数无限的,也就是说,此函数会将比例系数值的区间映射到步长的固定值。我可以给出算法的粗略描述,或者更准确地说,我需要的映射。它看起来类似于此(输入值是屏幕内的最大单位数):
- ...
- [5..9] -> 0.25
- [9..15] -> 0.5
- [15..30] -> 1
- ...
此处的值纯粹是经验值,仅用于说明。
但是,我不知道如何将这组映射外推到更大范围的比例系数值,更不用说如何分析地表达这种依赖关系了。但我确信这是可能的,因为我在许多绘图程序中看到过这样的事情。
我找到了 this看起来非常接近我需要的问题,但我无法根据我的任务调整答案,因为它提到了标签宽度,而我没有任何标签。
最佳答案
您可以为一个数量级(十的幂)精确定义它,然后类似地处理其他数量级并转换回来,例如
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);
}
我使用递归来阐明这个想法,但使用 log
和 pow
可能更有效。
关于algorithm - 一种根据比例重新计算坐标线上标记的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14468248/