Итак, у вас есть произвольное значение V
, и вы знаете, что 0 <= <code>V <= <code>Vmax.Вы хотите вычислить x-координату пикселя, назовите его X
, где ваш "экран" имеет x-координаты от 0 до Xmax
.Как вы говорите, чтобы сделать это "нормальным" способом, вы должны сделать
X = Xmax * V / Vmax
V = Vmax * X / Xmax
Мне нравится думать об этом, как будто я сначала нормализую значение, лежащее между 0 и 1, вычисляя V / Vmax
, а затем я умножаю это значение на максимум, чтобы получить значение от 0 до этого максимума.
Чтобы сделать то же самое логарифмически, вам нужен другой нижний предел для значения V
.Если V когда-либо <= 0, вы получите <code>ValueError.Итак, скажем, 0 <<code>Vmin <= <code>V <= <code>Vmax.Затем вам нужно выяснить , какой логарифм использовать, поскольку их бесконечно много.Обычно встречаются три, с основанием 2, e и 10, в результате чего ось X выглядит следующим образом:
------|------|------|------|---- ------|------|------|------|----
2^-1 2^0 2^1 2^2 == 0.5 1 2 4
------|------|------|------|---- ------|------|------|------|----
e^-1 e^0 e^1 e^2 == 0.4 1 2.7 7.4
------|------|------|------|---- ------|------|------|------|----
10^-1 10^0 10^1 10^2 == 0.1 1 10 100
Итак, в принципе, если мы можем получить показатели степени от выражений доСлева, мы можем использовать тот же принцип, что и выше, чтобы получить значение от 0 до Xmax
, и это, конечно, то, где входит журнал. Предполагая, что вы используете base b
, вы можете использовать эти выражения для преобразования туда и обратно:
from math import log
logmax = log(Vmax / Vmin, b)
X = Xmax * log(V / Vmin, b) / logmax
V = Vmin * b ** (logmax * X / Xmax)
Это почти тот же способ мышления, за исключением того, что вам нужно сначала убедиться, что log(somevalue, b)
даст вам неотрицательное значение.Вы делаете это путем деления на Vmin
внутри функции log
.Теперь вы можете разделить максимальное значение, которое может дать выражение, которое, конечно, равно log(Vmax / Vmin, b)
, и вы получите значение в диапазоне от 0 до 1, как и раньше.
Другим способом, который нам нужно сначала нормализовать(X / Xmax
), затем снова увеличьте масштаб (* logmax
) до максимума, ожидаемого обратной функцией.Кстати, обратное - повысить b
до некоторого значения.Теперь, если X
равно 0, b ** (logmax * X / Xmax)
будет равно 1, поэтому для получения правильного нижнего предела мы умножим на Vmin
.Или, другими словами, поскольку первое, что мы сделали, - это деление на Vmin
, нам нужно умножить на Vmin
как последнее, что мы сейчас делаем.
To "zoom«Правая сторона» уравнения, все, что вам нужно сделать, это переключить уравнения, чтобы вы возвели в степень, переходя от V
к X
, и берете логарифм, идущий в другую сторону.В принципе так и есть.Потому что вы также должны сделать что-то с фактом, что X
может быть 0:
logmax = log(Xmax + 1, b)
X = b ** (logmax * (V - Vmin) / (Vmax - Vmin)) - 1
V = (Vmax - Vmin) * log(X + 1, b) / logmax + Vmin