Wie konvertiere ich eine Zahl von einem Min / Max-Satz in einen anderen Min / Max-Satz? [geschlossen]

19

Ich mache Terrain-Generierung und ich habe eine Perlin-Bibliothek, die mir Zufallszahlen zwischen -1 und +1 gibt. Ich möchte dies auf die Skala von 0-255 umrechnen. Was ist der richtige Weg, um dies zu tun?

Thraka
quelle

Antworten:

23

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 ;

Kromster sagt Unterstützung Monica
quelle
2
Diese Antwort ergab für mein Programmierergehirn den größten Sinn. :) Ein "Dankeschön" an alle anderen für ihre tollen Antworten.
Thraka
10

Der Bereich -1bis 1ist ein Gesamtbereich von 2. Sie müssen es also entsprechend skalieren, um zu gelangen 255. Etwas wie das:

(randomPerlin + 1.0) * 127.5

Sie addieren also zunächst 1, um 0..2dann multiplizieren zu können 127.5, um eine Reihe von zu erhalten0..255

Blödmann
quelle
3

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))
Lars Viklund
quelle
3
oldRange = oldMax - oldMin
newRange = newMax - newMin

newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin

Hoffe das hilft.

Functionoid
quelle
2

Ü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

Valmond
quelle
2

Nehmen wir an, es xhandelt sich um die ursprüngliche Eingabe und ydie 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 mund 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.

Ankush
quelle
In unserem Bereich, die gemeinsame Bedeutung der linearen Interpolation neigt zu sein , dass Sie sich linear mit einem Mischungsfaktor wie dies zwischen zwei Mengen mischen: 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.
Lars Viklund
Die Sache ist, dass zwei Punkte in einer Ebene eine Linie eindeutig definieren. Wir können die Bereichszuordnung als gerade Linie behandeln. und wir kennen zwei Punkte auf dieser Linie. Wenn Sie es lösen, erhalten Sie eine Geradengleichung. Vielleicht ist lineare Interpolation hier nicht das richtige Wort, aber ich wollte Satz innerer Punkte zwischen diesen beiden Punkten auf dieser Linie bedeuten.
Ankush