您需要为对数图的点着色,但就好像它们不是对数的一样。
z
让图表上显示的某个值取值从a
到b
。我编译了 colormap - 一个函数,它根据传递给它的 0 到 1 范围内的数值来计算并返回颜色。让我们这样说:
table = [
# x R G B
[0, 0.01, 0.043, 1],
[0.2, 0.641, 0.164, 0.725],
[0.3, 0.988, 0.051, 0.11],
[0.5, 1, 0.975, 0.5],
[0.8, 1, 1, 1],
[1, 1, 1, 1]
]
为了计算每个特定点的颜色,我将其调整到所需的范围:
并绘制图表(以下为伪代码):
plot(values=z, colormap=colormap) # значения x для цвета рассчитываются внутри построителя
所有点的颜色都正确:
现在我取该值的对数z
并绘制图表:
plot(values=ln(z), colormap=colormap)
该图绘制正确,但我想让颜色与不使用对数时的颜色相同。
由于颜色是由构建器计算的,我只能更改颜色图。因此,我们需要以某种方式更改第一个颜色图列的值。
该值z'=ln(z)
可以取从a'=ln(a)
到 的值b'=ln(b)
。我们得到:
接下来,我命令我的家养小精灵弄清楚如何x'
用已知x
和未知来表达z
,,,但无论克利切如何努力a
,b
他都做不到。例如,如果将这两个方程相加,您将得到:
没有办法将z
其删除。我的直觉告诉我有一个解决方案,但我没有看到。a
b
您需要增强(取指数)表的第一列。但范围
0..1
将显示在 中1..e
,您1..e
还需要将其线性转换为对数化后的范围(图表上的内容是`0..147),即运行这个例子将此公式应用于颜色表中的所有x 。没有a和b是不可能的,映射(对数)不是线性函数,边界显着影响结果:
x' = (ln((b - a) x + a) - ln a) / (ln b - ln a)
或者像这样:
x' = ln(( b / a - 1) x + 1) / ln b / a
结论:
z = (b - a)x + a
z ε [a, b]
z' ∈ [ln a, ln b]
b' = ln b
z' ∈ [a', b']