Réponses:
La formule de base est:
Result := ((Input - InputLow) / (InputHigh - InputLow))
* (OutputHigh - OutputLow) + OutputLow;
Ton cas:
Résultat: = (( Input - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;
De là, vous pouvez optimiser la conversion si vos coefficients sont statiques, mais le compilateur le fera probablement lui-même également.
Résultat: = (( Entrée - -1 ) / 2 ) * 255 + 0 ;
Résultat: = entrée * 127,5 + 127,5 ;
Grâce à la puissance de la mise à l'échelle et du biais.
De votre valeur, soustrayez la valeur minimale de votre plage. Cela vous donnera une valeur dans la plage [0..2].
Divisez cela par la largeur de la plage source, en vous donnant une valeur dans la plage [0..1].
Multipliez cela par la largeur de la plage cible, en vous donnant une valeur dans la plage [0..255].
Ajoutez la base de la plage cible pour obtenir une valeur dans la plage cible, qui dans ce cas est la même que l'étape précédente.
En résumé:
(v - (-1.0))
v' = 0 + ---------------- * (255 - 0)
(1.0 - (-1.0))
oldRange = oldMax - oldMin
newRange = newMax - newMin
newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin
J'espère que cela t'aides.
Traduire la plage d' entrée pour obtenir le min à zéro en ajoutant 1 (la valeur négative de l'entrée min) -1 .. 1 -> 0 .. 2
Comme la plage de sortie commence par zéro, ne faites rien pour cela.
Mettre à l'échelle la nouvelle plage d'entrée afin qu'elle s'adapte à la plage de sortie, c'est facile car ils commencent maintenant tous les deux à zéro: multipliez la valeur par 255/2 0..2 * 2/255 -> 0..255
Terminé!
Exemple:
0,5 ira: (0,5 + 1) * 127,5 = 191,25 -0,5 ira: (-0,5 + 1) * 127,5 = 63,75
Disons qu'il x
s'agit de l'entrée d'origine et de la y
sortie attendue. Nous avons au moins deux points
(x, y) (-1, 0) (1, 255)
Puisque nous voulons faire une interpolation linéaire, nous pouvons regarder l'équation de forme
y = m*x + c
Avec plus de deux points, nous pouvons résoudre m
etc
Une fois cela fait, vous obtenez l'équation de transformation.
Notez que cette méthode fonctionne également pour d'autres types d'équations. par exemple, si vous voulez une interpolation exponentielle ou quadratique.
v = (1-a)*x + (a)*y
. Je ne vois pas en quoi cette réponse a beaucoup de pertinence avec la question posée car tout ce qu'il veut, c'est une cartographie des plages.