Ответы:
Базовая формула:
Result := ((Input - InputLow) / (InputHigh - InputLow))
* (OutputHigh - OutputLow) + OutputLow;
Ваш случай:
Результат: = (( Вход - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;
Отсюда вы можете оптимизировать преобразование, если ваши коэффициенты статичны, но компилятор, вероятно, сделает это и сам.
Результат: = (( Вход - -1 ) / 2 ) * 255 + 0 ;
Результат: = Ввод * 127,5 + 127,5 ;
Диапазон -1
до 1
общего диапазона 2
. Так что вам нужно масштабировать его соответствующим образом, чтобы добраться до 255
. Что-то вроде этого:
(randomPerlin + 1.0) * 127.5
Таким образом, вы сначала добавляете 1
, чтобы получить 0..2
затем умножить с, 127.5
чтобы получить диапазон0..255
Через силу масштабирования и смещения.
Из вашего значения вычтите минимальное значение вашего диапазона. Это даст вам значение в диапазоне [0..2].
Разделите это на ширину исходного диапазона, чтобы получить значение в диапазоне [0..1].
Умножьте это на ширину целевого диапазона, чтобы получить значение в диапазоне [0..255].
Добавьте базу целевого диапазона, чтобы получить значение в целевом диапазоне, которое для этого случая совпадает с предыдущим шагом.
В итоге:
(v - (-1.0))
v' = 0 + ---------------- * (255 - 0)
(1.0 - (-1.0))
oldRange = oldMax - oldMin
newRange = newMax - newMin
newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin
Надеюсь это поможет.
Переведите входной диапазон, чтобы получить минимальное значение, равное нулю, добавив 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
Допустим, x
исходный ввод и y
ожидаемый вывод. У нас есть как минимум две точки
(x, y) (-1, 0) (1, 255)
Так как мы хотим сделать линейную интерполяцию, мы можем посмотреть в уравнение формы
y = m*x + c
С вышеупомянутыми двумя пунктами мы можем решить для m
иc
только это будет сделано, вы получите уравнение преобразования.
Обратите внимание, что этот метод работает и для других типов уравнений. Например, если вы хотите экспоненциальную или квадратичную интерполяцию.
v = (1-a)*x + (a)*y
. Я не понимаю, как этот ответ имеет большое отношение к задаваемому вопросу, так как все, что он хочет, - это отображение диапазона.