Risposte:
La formula di base è:
Result := ((Input - InputLow) / (InputHigh - InputLow))
* (OutputHigh - OutputLow) + OutputLow;
Il tuo caso:
Risultato: = (( Input - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;
Da qui puoi ottimizzare la conversione se i tuoi coefficienti sono statici, ma probabilmente anche il compilatore lo farà da solo.
Risultato: = (( Input - -1 ) / 2 ) * 255 + 0 ;
Risultato: = input * 127,5 + 127,5 ;
Attraverso il potere del ridimensionamento e della distorsione.
Dal tuo valore, sottrai il valore minimo del tuo intervallo. Questo ti darà un valore nell'intervallo [0..2].
Dividilo per la larghezza dell'intervallo di origine, dandoti un valore nell'intervallo [0..1].
Moltiplicalo per la larghezza dell'intervallo target, dandoti un valore nell'intervallo [0..255].
Aggiungi la base dell'intervallo target per ottenere un valore nell'intervallo target, che in questo caso è lo stesso del passaggio precedente.
In sintesi:
(v - (-1.0))
v' = 0 + ---------------- * (255 - 0)
(1.0 - (-1.0))
oldRange = oldMax - oldMin
newRange = newMax - newMin
newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin
Spero che sia di aiuto.
Traduci l' intervallo di input in modo da ottenere il minimo a zero aggiungendo 1 (il valore negativo dell'ingresso minimo) -1 .. 1 -> 0 .. 2
Poiché l'intervallo di output inizia con zero, non fare nulla per quello.
Ridimensionare il nuovo intervallo di input in modo che si adatti al range di output, questo è facile in quanto entrambi iniziano a zero: moltiplicare il valore per 255/2 0..2 * 2/255 -> 0..255
Fatto!
Esempio:
0,5 andrà: (0,5 + 1) * 127,5 = 191,25 -0,5 andrà: (-0,5 + 1) * 127,5 = 63,75
Diciamo che x
è l'input originale e l' y
output previsto. Abbiamo almeno due punti
(x, y) (-1, 0) (1, 255)
Dato che vogliamo fare un'interpolazione lineare , possiamo esaminare l'equazione della forma
y = m*x + c
Con due punti sopra, possiamo risolvere m
e, una c
volta fatto, ottieni l'equazione di trasformazione.
Nota che questo metodo funziona anche per altri tipi di equazioni. ad es. se si desidera un'interpolazione esponenziale o quadratica.
v = (1-a)*x + (a)*y
. Non vedo come questa risposta abbia molta rilevanza per la domanda posta in quanto tutto ciò che vuole è una mappatura di intervallo.