Odpowiedzi:
Podstawowa formuła to:
Result := ((Input - InputLow) / (InputHigh - InputLow))
* (OutputHigh - OutputLow) + OutputLow;
Twój przypadek:
Wynik: = (( Input - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;
Stąd możesz zoptymalizować konwersję, jeśli twoje współczynniki są statyczne, ale kompilator prawdopodobnie zrobi to samo.
Wynik: = (( Input - -1 ) / 2 ) * 255 + 0 ;
Wynik: = Dane wejściowe * 127,5 + 127,5 ;
Dzięki sile skalowania i stronniczości.
Od wartości odejmij minimalną wartość zakresu. To da ci wartość z zakresu [0..2].
Podziel to przez szerokość zakresu źródłowego, dając wartość z zakresu [0..1].
Pomnóż to przez szerokość zakresu docelowego, dając wartość z zakresu [0..255].
Dodaj podstawę zakresu docelowego, aby uzyskać wartość w zakresie docelowym, który w tym przypadku jest taki sam jak w poprzednim kroku.
W podsumowaniu:
(v - (-1.0))
v' = 0 + ---------------- * (255 - 0)
(1.0 - (-1.0))
oldRange = oldMax - oldMin
newRange = newMax - newMin
newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin
Mam nadzieję że to pomoże.
Przetłumacz zakres wejściowy, aby uzyskać min do zera przez dodanie 1 (ujemna wartość minimalnego wejścia) -1 .. 1 -> 0 .. 2
Ponieważ zakres wyjściowy zaczyna się od zera, nie rób nic dla tego.
Skaluj nowy zakres wejściowy, aby pasował do zakresu wyjściowego, jest to łatwe, ponieważ teraz oba zaczynają się od zera: pomnóż wartość przez 255/2 0..2 * 2/255 -> 0..255
Gotowy!
Przykład:
0,5 pójdzie: (0,5 + 1) * 127,5 = 191,25 -0,5 pójdzie: (-0,5 + 1) * 127,5 = 63,75
Powiedzmy, że x
to oryginalne wejście i y
oczekiwane wyjście. Mamy co najmniej dwa punkty
(x, y) (-1, 0) (1, 255)
Ponieważ chcemy wykonać interpolację liniową , możemy przyjrzeć się równaniu formy
y = m*x + c
Z powyższymi dwoma punktami możemy rozwiązać m
i c
Gdy to zrobisz, otrzymasz równanie transformacji.
Uwaga: ta metoda działa również w przypadku innych typów równań. np. jeśli chcesz interpolacji wykładniczej lub kwadratowej.
v = (1-a)*x + (a)*y
. Nie rozumiem, w jaki sposób ta odpowiedź ma duże znaczenie dla zadanego pytania, ponieważ wszystko, czego chce, to mapowanie zasięgu.