Як перетворити число з одного набору min / max в інший min \ max? [зачинено]


19

Я займаюся генерацією місцевості і маю бібліотеку перлин, яка дає мені випадкові числа від -1 до +1. Я хочу перетворити це в масштаб 0-255. Який правильний спосіб це зробити?

Відповіді:


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


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

Сподіваюся, це допомагає.


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


2

Скажімо, xце оригінальний вхід і yочікується вихід. Маємо принаймні дві точки (x, y) (-1, 0) (1, 255)

Оскільки ми хочемо зробити лінійну інтерполяцію, ми можемо заглянути в рівняння форми y = m*x + c

Маючи вище два пункти, ми можемо вирішити для, mі c як тільки це буде зроблено, ви отримаєте рівняння перетворення.

Зауважте, що цей метод працює і для інших типів рівнянь. Наприклад, якщо ви хочете експоненціальної чи квадратичної інтерполяції.


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

річ у двох точках у площині однозначно визначають лінію. ми можемо трактувати відображення діапазону як пряму лінію. і ми знаємо два моменти на цій лінії. розв’язуючи це, дамо рівняння прямої. Можливо, лінійна інтерполяція не є правильним словом тут, але я хотів би означати набір внутрішніх точок між цими двома точками на цій прямій.
Анкуш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.