Comment mapper les nombres, linéairement, entre a et b pour aller entre c et d.
Autrement dit, je veux que les nombres entre 2 et 6 correspondent aux nombres entre 10 et 20 ... mais j'ai besoin du cas généralisé.
Mon cerveau est frit.
Comment mapper les nombres, linéairement, entre a et b pour aller entre c et d.
Autrement dit, je veux que les nombres entre 2 et 6 correspondent aux nombres entre 10 et 20 ... mais j'ai besoin du cas généralisé.
Mon cerveau est frit.
Réponses:
Si votre nombre X se situe entre A et B, et que vous souhaitez que Y tombe entre C et D, vous pouvez appliquer la transformation linéaire suivante:
Cela devrait vous donner ce que vous voulez, bien que votre question soit un peu ambiguë, car vous pouvez également mapper l'intervalle dans le sens inverse. Faites juste attention à la division par zéro et vous devriez être OK.
la source
Y=f(X)=m*X+b
, où m et b ont été déterminés simultanément à partir des deux équations de contraintes suivantes qui résultent de la substitution des valeurs de X et Y aux points d'extrémité requis:C=m*A+b
etD=m*B+b
X=A+(A-B)*t
pour prouver l'égalité entre cette approche et celle de Peter. t est essentiellement une non dimensionnalisation de X. (t=(X-A)/(A-B)
)Divisez pour obtenir le rapport entre les tailles des deux plages, puis soustrayez la valeur de départ de votre plage initiale, multipliez par le rapport et ajoutez la valeur de départ de votre deuxième plage. En d'autres termes,
Cela répartit uniformément les nombres de la première plage dans la seconde plage.
la source
Ce serait bien d'avoir cette fonctionnalité dans la
java.lang.Math
classe, car c'est une fonction si largement requise et disponible dans d'autres langues. Voici une implémentation simple:Je mets ce code ici comme référence pour l'avenir moi-même et cela aidera peut-être quelqu'un.
la source
En passant, c'est le même problème que le classique convertir celcius en farenheit où vous voulez mapper une plage de nombres qui équivaut à 0 - 100 (C) à 32 - 212 (F).
la source
Chaque intervalle unitaire sur la première plage occupe (dc) / (ba) "espace" sur la seconde plage.
Pseudo:
La manière dont vous gérez les arrondis dépend de vous.
la source
Avec des contrôles sur la division par zéro, bien sûr.
la source
si votre plage de [a à b] et que vous voulez la mapper en [c à d] où x est la valeur que vous voulez mapper, utilisez cette formule (mappage linéaire)
la source
https://rosettacode.org/wiki/Map_range
la source
En plus de la réponse @PeterAllenWebb, si vous souhaitez inverser le résultat, utilisez ce qui suit:
la source