Как мне сопоставить числа, линейно, между a и b, чтобы перейти между c и d.
То есть я хочу, чтобы числа от 2 до 6 соответствовали числам от 10 до 20 ... но мне нужен обобщенный случай.
Мой мозг сгорел.
Как мне сопоставить числа, линейно, между a и b, чтобы перейти между c и d.
То есть я хочу, чтобы числа от 2 до 6 соответствовали числам от 10 до 20 ... но мне нужен обобщенный случай.
Мой мозг сгорел.
Ответы:
Если ваше число X находится между A и B, а вы хотите, чтобы Y находился между C и D, вы можете применить следующее линейное преобразование:
Это должно дать вам то, что вы хотите, хотя ваш вопрос немного двусмысленный, поскольку вы также можете отобразить интервал в обратном направлении. Просто следите за делением на ноль, и все будет в порядке.
источник
Y=f(X)=m*X+b
где m и b были определены одновременно из следующих двух уравнений ограничений, которые являются результатом подстановки значений X и Y в требуемых конечных точках:C=m*A+b
иD=m*B+b
X=A+(A-B)*t
чтобы доказать равенство между этим подходом и подходом Питера. t по сути является обезразмериванием X. (t=(X-A)/(A-B)
)Разделите, чтобы получить соотношение между размерами двух диапазонов, затем вычтите начальное значение вашего начального диапазона, умножьте на соотношение и добавьте начальное значение вашего второго диапазона. Другими словами,
Это равномерно распределяет числа из первого диапазона во втором диапазоне.
источник
Было бы неплохо иметь эту функциональность в
java.lang.Math
классе, так как это широко востребованная функция, доступная на других языках. Вот простая реализация:Я сам помещаю этот код здесь в качестве ориентира на будущее, и, возможно, он кому-то поможет.
источник
В стороне, это та же проблема, что и при классическом преобразовании целциуса в фаренгейт, когда вы хотите сопоставить диапазон чисел, который от 0 до 100 (C) до 32-212 (F).
источник
Каждый единичный интервал в первом диапазоне занимает (dc) / (ba) «пространство» во втором диапазоне.
Псевдо:
Как вы будете обрабатывать округление, зависит от вас.
источник
Конечно, с проверкой деления на ноль.
источник
если ваш диапазон от [a до b] и вы хотите отобразить его в [c to d], где x - значение, которое вы хотите сопоставить, используйте эту формулу (линейное сопоставление)
источник
https://rosettacode.org/wiki/Map_range
источник
В дополнение к ответу @PeterAllenWebb, если вы хотите отменить результат, используйте следующее:
источник