<p>所以你有一些任意值<code>V</code>,你知道0<;=<code>V</code><;=<code>Vmax</code>。你想计算一个像素的x坐标,称之为<code>X</code>,其中“screen”的x坐标为0到<code>Xmax</code>。正如你所说,要用“正常”的方式来做,你应该这样做</p>
<pre><code>X = Xmax * V / Vmax
V = Vmax * X / Xmax
</code></pre>
<p>我喜欢这样想,就像我首先通过计算<code>V / Vmax</code>将值规范化为介于0和1之间,然后将这个值乘以最大值,得到一个介于0和那个最大值之间的值。在</p>
<p>要在逻辑上执行相同的操作,您需要为<code>V</code>值设置一个不同的下限。如果V曾经是<;=0,则得到一个<code>ValueError</code>。假设0<;<code>Vmin</code><;=<code>V</code><;=<code>Vmax</code>。然后你需要找出使用什么对数,因为对数是无穷多的。通常会遇到三种情况,即基数为2、e和10的情况下,x轴如下所示:</p>
^{pr2}$
<p>所以原则上,如果我们能从左边的表达式中得到指数,我们可以用同样的原理来得到一个介于0和<code>Xmax</code>之间的值,当然这就是log的来源。假设您使用base<code>b</code>,则可以使用以下表达式来回转换:</p>
<pre><code>from math import log
logmax = log(Vmax / Vmin, b)
X = Xmax * log(V / Vmin, b) / logmax
V = Vmin * b ** (logmax * X / Xmax)
</code></pre>
<p>这几乎是相同的思维方式,只是需要首先确保<code>log(somevalue, b)</code>将给您一个非负值。通过在<code>log</code>函数中除以<code>Vmin</code>来实现这一点。现在你可以除以表达式所能产生的最大值,当然是<code>log(Vmax / Vmin, b)</code>,你将得到一个介于0和1之间的值,与之前一样。在</p>
<p>另一种方法我们需要首先规范化(<code>X / Xmax</code>),然后再次放大(<code>* logmax</code>)到逆函数所期望的最大值。顺便说一下,相反的方法是将<code>b</code>提高到某个值。现在如果<code>X</code>为0,<code>b ** (logmax * X / Xmax)</code>将等于1,所以为了得到正确的下限,我们将<code>Vmin</code>相乘。或者换一种说法,因为我们做的第一件事就是用<code>Vmin</code>除,所以我们现在做的最后一件事就是用<code>Vmin</code>相乘。在</p>
<p>要“缩放”方程的“右侧”,您只需切换方程,这样您就可以从<code>V</code>到{<cd4>}进行幂运算,并将对数取反方向。原则上,就是这样。因为你还得做一些事情,因为<code>X</code>可以是0:</p>
<pre><code>logmax = log(Xmax + 1, b)
X = b ** (logmax * (V - Vmin) / (Vmax - Vmin)) - 1
V = (Vmax - Vmin) * log(X + 1, b) / logmax + Vmin
</code></pre>