algorithm - 一种根据比例重新计算坐标线上标记的算法

标签 algorithm scaling zooming

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

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

因此,我需要以某种方式重新调整用于绘制引用线的间隔。换句话说,我需要一个类型为 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);
}

我使用递归来阐明这个想法,但使用 logpow 可能更有效。

关于algorithm - 一种根据比例重新计算坐标线上标记的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14468248/

相关文章:

iphone - 我可以使用 UIWebView 的缩放功能来增加 HTML 文本大小吗?并且不会丢失任何内容?

Android:如何将 map View 的缩放级别设置为当前位置周围 1 公里半径?

iPhone 缩放不会放大菜单按钮中的文本

c# - 超时后失败的最佳方法是什么?

c++ - 放大纹理时如何关闭 OpenGL 过滤?

java - 缩放图形(初级 Java 程序员)

c++ - OpenGl 更改坐标系的度量单位

c - 在c中重新编码unix命令ls(格式化输出)

algorithm - 如果 a 是整数数组且 n 是数组的长度,则 O(sum(a)) 的总体 O(n) 时间复杂度是多少?

python - 找到进入目标的最大数字,留下最小的余数