формула
f (x) = (x - input_start) / (input_end - input_start) * (output_end -
output_start) + output_start
Я подключу этот пост здесь: https://betterexplained.com/articles/rethinking-arithmetic-a-visual-guide/, поскольку он мне очень помог, когда я пытался придумать это интуитивно. Как только вы поймете, о чем говорится в посте, вы легко можете придумать эти формулы самостоятельно. Обратите внимание, что я имел обыкновение бороться с такими вопросами. (У меня нет связей - просто нашел это очень полезным)
скажем, у вас есть диапазон [input_start..input_end]
, давайте начнем с его нормализации таким образом, чтобы 0 было input_start
, а 1 - input_end
. это простая техника, чтобы облегчить проблему.
как нам это сделать? мы, мы должны будем сдвинуть все влево на величину input_start, так что если значение x равно input_start
, оно должно дать ноль.
Итак, допустим, f(x)
- это функция, которая выполняет преобразование.
f(x) = x - input_start
попробуем:
f(input_start) = input_start - input_start = 0
работает на input_start
.
на данный момент он не работает для input_end
, поскольку мы не масштабировали его.
давайте просто уменьшим его на длину диапазона, тогда у нас будет самое большое значение (input_end), сопоставленное одному.
f(x) = (x - input_start) / (input_end - input_start)
хорошо, давайте попробуем с input_end
.
е (input_end) = (input_end - input_start) / (input_end - input_start) = 1
Круто, похоже на работу.
хорошо, следующий шаг, мы фактически масштабируем его до выходного диапазона. Это так же просто, как умножение на фактическую длину выходного диапазона, например:
f(x) = (x - input_start) / (input_end - input_start) * (output_end - output_start)
Теперь, на самом деле, мы почти закончили, нам просто нужно сдвинуть его вправо, чтобы 0 начиналось с output_start.
f(x) = (x - input_start) / (input_end - input_start) * (output_end - output_start) + output_start
давайте попробуем.
f(input_start) = (input_start - input_start) / (input_end - input_start) * (output_end - output_start) + output_start
вы видите, что первая часть уравнения в значительной степени умножается на ноль, что сводит на нет все, давая вам
f(input_start) = output_start
давайте попробуем input_end
.
f(input_end) = (input_end - input_start) / (input_end - input_start) * (output_end - output_start) + output_start
что в свою очередь будет иметь вид:
f(input_end) = output_end - output_start + output_start = output_end
Как вы можете видеть, теперь оно отображается правильно.