线性缩放功能 2D
Linear zoom function 2D
我有一个 canvas 和一个比例值。最大比例为 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 为底的对数,但我找不到正确的函数。
为了提供恒定参数差异的恒定比率,您需要指数函数(可以使用任何基数,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)
您需要的不是对数,而是root。您的要求实际上是:您想要找到这样的序列 A[i]
that
A[0]
= 0.1
A[N]
= 1
A[i+1]
/A[i]
= k
,其中 k
是某个常数
这个问题的解决方案显然是
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/9
或 1/16
我有一个 canvas 和一个比例值。最大比例为 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 为底的对数,但我找不到正确的函数。
为了提供恒定参数差异的恒定比率,您需要指数函数(可以使用任何基数,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)
您需要的不是对数,而是root。您的要求实际上是:您想要找到这样的序列 A[i]
that
A[0]
= 0.1A[N]
= 1A[i+1]
/A[i]
=k
,其中k
是某个常数
这个问题的解决方案显然是
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/9
或 1/16