Comment convertir un nombre d'un ensemble min \ max en un autre ensemble min \ max? [fermé]

19

Je fais de la génération de terrain et j'ai une bibliothèque Perlin qui me donne des nombres aléatoires entre -1 et +1. Je veux convertir cela à l'échelle de 0 à 255. Quelle est la bonne façon de procéder?

Thraka
la source

Réponses:

23

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 ;

Kromster dit soutenir Monica
la source
2
Cette réponse avait le plus de sens pour mon cerveau de programmeur. :) Un "merci" à tous les autres pour leurs excellentes réponses.
Thraka
10

La plage -1à 1est une plage totale de 2. Vous devez donc l'adapter de manière appropriée pour y accéder 255. Quelque chose comme ça:

(randomPerlin + 1.0) * 127.5

Donc, vous ajoutez d'abord 1, pour obtenir 0..2puis multiplier avec 127.5pour obtenir une gamme de0..255

bummzack
la source
3

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

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

J'espère que cela t'aides.

fonctionnoid
la source
2

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

Valmond
la source
2

Disons qu'il xs'agit de l'entrée d'origine et de la ysortie 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 metc 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.

Ankush
la source
Dans notre domaine, le sens commun de l'interpolation linéaire a tendance à être que vous mélangez linéairement entre deux quantités avec un facteur de mélange comme celui-ci: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.
Lars Viklund
la chose est deux points dans un plan définissent uniquement une ligne. nous pouvons traiter le mappage de plage comme une ligne droite. et nous connaissons deux points sur cette ligne. le résoudre donnera une équation linéaire. peut-être l'interpolation linéaire n'est pas le bon mot ici, mais je voulais dire un ensemble de points intérieurs entre ces deux points sur cette ligne.
Ankush