Antworten:
Basisformel ist:
Result := ((Input - InputLow) / (InputHigh - InputLow))
* (OutputHigh - OutputLow) + OutputLow;
Dein Fall:
Ergebnis: = (( Eingabe - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;
Von hier aus können Sie die Konvertierung optimieren, wenn Ihre Koeffizienten statisch sind, aber der Compiler wird dies wahrscheinlich auch selbst tun.
Ergebnis: = (( Eingabe - -1 ) / 2 ) * 255 + 0 ;
Ergebnis: = Eingabe * 127,5 + 127,5 ;
Durch die Kraft von Skalierung und Voreingenommenheit.
Subtrahieren Sie von Ihrem Wert den Mindestwert Ihres Bereichs. Das ergibt einen Wert im Bereich [0..2].
Teilen Sie dies durch die Breite des Quellbereichs und geben Sie einen Wert im Bereich [0..1] an.
Multiplizieren Sie dies mit der Breite des Zielbereichs, um einen Wert im Bereich [0..255] zu erhalten.
Fügen Sie die Basis des Zielbereichs hinzu, um einen Wert im Zielbereich zu erhalten, der in diesem Fall mit dem vorherigen Schritt identisch ist.
Zusammenfassend:
(v - (-1.0))
v' = 0 + ---------------- * (255 - 0)
(1.0 - (-1.0))
oldRange = oldMax - oldMin
newRange = newMax - newMin
newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin
Hoffe das hilft.
Übersetzen Sie den Eingangsbereich , so dass wir die min auf Null durch Zugabe von 1 (der negative Wert des min - Eingang) erhalten -1 .. 1 -> 0 .. 2
Da der Ausgabebereich mit Null beginnt, nichts dafür tun.
Skalieren Sie den neuen Eingabebereich so, dass er zum Ausgabebereich passt. Dies ist einfach, da beide jetzt bei Null beginnen: Multiplizieren Sie den Wert mit 255/2 0..2 * 2/255 -> 0..255
Getan!
Beispiel:
0,5 ergibt: (0,5 + 1) * 127,5 = 191,25 -0,5 ergibt: (-0,5 + 1) * 127,5 = 63,75
Nehmen wir an, es x
handelt sich um die ursprüngliche Eingabe und y
die erwartete Ausgabe. Wir haben mindestens zwei Punkte
(x, y) (-1, 0) (1, 255)
Da wir eine lineare Interpolation durchführen wollen, können wir die Formgleichung untersuchen
y = m*x + c
Mit den obigen zwei Punkten können wir lösen m
und c
sobald dies erledigt ist, erhalten Sie die Transformationsgleichung.
Beachten Sie, dass diese Methode auch für andere Arten von Gleichungen funktioniert. zB Wenn Sie eine exponentielle oder quadratische Interpolation wünschen.
v = (1-a)*x + (a)*y
. Ich verstehe nicht, wie wichtig diese Antwort für die gestellte Frage ist, da er nur eine Bereichszuordnung haben möchte.