Как преобразовать число из одного набора min \ max в другой набор min \ max? [закрыто]

19

Я делаю рельеф местности, и у меня есть библиотека perlin, которая дает мне случайные числа от -1 до +1. Я хочу преобразовать это в шкалу 0-255. Как правильно это сделать?

Thraka
источник

Ответы:

23

Базовая формула:

Result := ((Input - InputLow) / (InputHigh - InputLow))
          * (OutputHigh - OutputLow) + OutputLow;

Ваш случай:

Результат: = (( Вход - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

Отсюда вы можете оптимизировать преобразование, если ваши коэффициенты статичны, но компилятор, вероятно, сделает это и сам.

Результат: = (( Вход - -1 ) / 2 ) * 255 + 0 ;

Результат: = Ввод * 127,5 + 127,5 ;

Кромстер говорит, что поддерживает Монику
источник
2
Этот ответ был наиболее понятен моему мозгу программиста. :) Благодарю всех за отличные ответы.
Thraka
10

Диапазон -1до 1общего диапазона 2. Так что вам нужно масштабировать его соответствующим образом, чтобы добраться до 255. Что-то вроде этого:

(randomPerlin + 1.0) * 127.5

Таким образом, вы сначала добавляете 1, чтобы получить 0..2затем умножить с, 127.5чтобы получить диапазон0..255

bummzack
источник
3

Через силу масштабирования и смещения.

Из вашего значения вычтите минимальное значение вашего диапазона. Это даст вам значение в диапазоне [0..2].

Разделите это на ширину исходного диапазона, чтобы получить значение в диапазоне [0..1].

Умножьте это на ширину целевого диапазона, чтобы получить значение в диапазоне [0..255].

Добавьте базу целевого диапазона, чтобы получить значение в целевом диапазоне, которое для этого случая совпадает с предыдущим шагом.

В итоге:

            (v - (-1.0)) 
v' = 0 + ---------------- * (255 - 0)
          (1.0 - (-1.0))
Ларс Виклунд
источник
3
oldRange = oldMax - oldMin
newRange = newMax - newMin

newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin

Надеюсь это поможет.

functionoid
источник
2

Переведите входной диапазон, чтобы получить минимальное значение, равное нулю, добавив 1 (отрицательное значение минимального значения) -1 .. 1 -> 0 .. 2

Поскольку выходной диапазон начинается с нуля, ничего для этого не делайте.

Масштабируйте новый входной диапазон так, чтобы он соответствовал выходному диапазону, это легко, поскольку теперь они оба начинаются с нуля: умножьте значение на 255/2 0..2 * 2/255 -> 0..255

Выполнено!

Пример:

0,5 пойдет: (0,5 + 1) * 127,5 = 191,25 -0,5 пойдет: (-0,5 + 1) * 127,5 = 63,75

Valmond
источник
2

Допустим, xисходный ввод и yожидаемый вывод. У нас есть как минимум две точки (x, y) (-1, 0) (1, 255)

Так как мы хотим сделать линейную интерполяцию, мы можем посмотреть в уравнение формы y = m*x + c

С вышеупомянутыми двумя пунктами мы можем решить для mиc только это будет сделано, вы получите уравнение преобразования.

Обратите внимание, что этот метод работает и для других типов уравнений. Например, если вы хотите экспоненциальную или квадратичную интерполяцию.

Ankush
источник
В нашей области, общий смысл линейной интерполяции , как правило, что вы смешиваете линейно между двумя величинами с смешиванием фактором , как это: v = (1-a)*x + (a)*y. Я не понимаю, как этот ответ имеет большое отношение к задаваемому вопросу, так как все, что он хочет, - это отображение диапазона.
Ларс Виклунд
Дело в том, что две точки на плоскости однозначно определяют линию. мы можем рассматривать отображение диапазона как прямую линию. и мы знаем две точки на этой линии. ее решение даст линейное уравнение. Может быть, линейная интерполяция здесь не то слово, но я хотел иметь в виду набор внутренних точек между этими двумя точками на этой линии.
Ankush