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?

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 ;


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


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))

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

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

J'espère que cela t'aides.


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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.