线性变焦功能2D

时间:2017-12-14 17:18:11

标签: math canvas zoom

我有画布和比例值。最大比例为1,最小比例值为0.1或更高。 假设我们有离散的时间单位。我正在寻找一个函数,在一段时间I(简称100个时间单位)内,从开始缩放s到结束缩放e进行线性缩放。设0 >= i < I为当前间隔。

示例:以100个时间单位从0.2缩放到1.0。

显然zoom(i) = (e-s)/I * i不会产生线性缩放。因为从0.2到0.4的步长使变焦倍增,而相同的量从0.8到1.0只会使变焦增加25%。

我当时认为这个函数需要对数为2的对数,但我找不到合适的函数。

2 个答案:

答案 0 :(得分:1)

要提供具有常量参数差异的恒定比率,您需要指数函数(可以使用任何基数,e, 2, 10等等,并具有相应的对数)

F(x) = A * Exp(B * x)

获得给定边界条件的系数A和B(参数x0对应于函数值F0):

F0 = A * Exp(B * x0)
F1 = A * Exp(B * x1)

将第二个等式除以第一个等式:

Exp(B * (x1 -x0) = F1 / F0
B * (x1 -x0) = ln(F1 / F0)

所以

B = ln(F1 / F0) / (x1 - x0)

A = F0 * Exp(-B * x0)

为您的例子

x0=0, x1=100
zoom0 = 0.2, zoom1=1
B = ln(5) / 100 = 0.0161
A = 0.2 * Exp(0) = 0.2
zoom(i) = 0.2 * Exp(0.0161 * i)

zoom(0) = 0.2
zoom(50) = 0.447
zoom(100) = 1

note that 
zoom(50) / zoom(0) = zoom(100) / zoom(50)

答案 1 :(得分:1)

您需要的不是对数,而是root。您的要求有效地遵循:您希望找到

这样的序列A[i]
  1. A[0] = 0.1
  2. A[N] = 1
  3. A[i+1] / A[i] = k,其中k是常量
  4. 对此的解决方案显然是

    A[i] = 0.1 * k^i
    

    所以k应该是

    k^N = 1/0.1 = 10
    

    k = root(10, N) = 10^(1/N)
    

    出于实际原因,使用N为2的幂可能更好,因此您可以通过乘以较小的根来计算一些中间结果 累积的舍入误差。我的意思是

    a[N/2] = sqrt(0.1) = 0.1 * sqrt(1/0.1)
    a[N/4] = 0.1 * root(1/0.1, 4)
    a[3*N/4] = a[N/2] * root(1/0.1, 4)
    

    0.1的起始值更改为本身具有某种威力的内容(例如1/91/16

    也可能有意义