Die Formel lautet
f (x) = (x - Eingabestart) / (Eingabeende - Eingabestart) * (Ausgabeende - Ausgabestart) + Ausgabestart
Ich werde diesen Beitrag hier anschließen: https://betterexplained.com/articles/rethinking-arithmetic-a-visual-guide/, da es mir sehr geholfen hat, dies intuitiv zu finden. Sobald Sie verstanden haben, was der Beitrag sagt, ist es trivial, diese Formeln selbst zu erstellen. Beachten Sie, dass ich auch mit solchen Fragen zu kämpfen hatte. (Ich habe keine Zugehörigkeit - fand es nur sehr nützlich)
Angenommen, Sie haben eine Reichweite [input_start..input_end]
. Beginnen wir damit, sie so zu normalisieren, dass 0 ist input_start
und 1 ist input_end
. Dies ist eine einfache Technik, um das Problem zu vereinfachen.
wie machen wir das? Wir müssten alles, was noch übrig ist, um den Betrag input_start verschieben, so dass, wenn Eingabe x zufällig ist input_start
, sie Null ergeben sollte.
Nehmen wir also an, es f(x)
ist die Funktion, die die Konvertierung durchführt.
f(x) = x - input_start
Lass es uns versuchen:
f(input_start) = input_start - input_start = 0
arbeitet für input_start
.
Zu diesem Zeitpunkt funktioniert es noch input_end
nicht, da wir es nicht skaliert haben.
Skalieren wir es einfach um die Länge des Bereichs, dann wird der größte Wert (input_end) einem zugeordnet.
f(x) = (x - input_start) / (input_end - input_start)
ok, lass es uns versuchen mit input_end
.
f(input_end) = (input_end - input_start) / (input_end - input_start) = 1
genial, scheint zu funktionieren.
Okay, im nächsten Schritt skalieren wir es tatsächlich auf den Ausgabebereich. Es ist so trivial wie nur das Multiplizieren mit der tatsächlichen Länge des Ausgabebereichs als solches:
f(x) = (x - input_start) / (input_end - input_start) * (output_end - output_start)
Jetzt sind wir fast fertig. Wir müssen es nur noch nach rechts verschieben, damit 0 von output_start ausgeht.
f(x) = (x - input_start) / (input_end - input_start) * (output_end - output_start) + output_start
Lassen Sie es uns kurz versuchen.
f(input_start) = (input_start - input_start) / (input_end - input_start) * (output_end - output_start) + output_start
Sie sehen, dass der erste Teil der Gleichung so ziemlich mit Null multipliziert wird, wodurch alles aufgehoben wird und Sie erhalten
f(input_start) = output_start
Lass es uns auch versuchen input_end
.
f(input_end) = (input_end - input_start) / (input_end - input_start) * (output_end - output_start) + output_start
was wiederum enden wird als:
f(input_end) = output_end - output_start + output_start = output_end
Wie Sie sehen können, scheint es jetzt korrekt zugeordnet zu sein.