2013-09-27 2 views
3

l'exemple comprise entre 1 (minimum et maximum):Traduire nombres à partir d'une gamme à une autre gamme

[40 ... 480] 

numéros des exemples de la gamme 1:

[42, 59.4, 78.18, 120.43, 416] 

exemple compris entre 2:

[10 .. 140] 

Comment puis-je traduire les valeurs des nombres de la plage 1 en valeurs dans la seconde plage? 42 devrait être équivalent à quelque chose entre 10 et 11 dans la nouvelle gamme. J'utilise PHP mais cela ressemble plus à un problème de maths.

Je sais comment les aligner sur la deuxième plage:

$diff = $range[0] - $numbers[0]; 
foreach($numbers as $i => $number){ 
    $numbers[$i] = $number + $diff; 
} 

Mais c'est tout :(

Répondre

3

Vous pouvez transformer l'une des gammes dans l'autre avec cette fonction (python)

def transfrom(x): 
    return (x - 40)*(130/440.0) + 10 

En général, l'idée est que vous voulez rebasage les plages (assurez-vous qu'ils commencent tous les deux à zéro), puis trouver comment vous devez étirer la première gamme pour obtenir la deuxième gamme. Ainsi, les étapes seraient

  1. Convertir la première gamme de [0-440] en soustrayant 40 et la seconde plage de [0-130] en soustrayant 10. Ceci est fait pour obtenir des intervalles qui commencent à zéro et qui sont faciles à mettre à l'échelle.
  2. Pour convertir une valeur de [0-440] à une valeur correspondante de [0-130], vous devez la multiplier par 130/440. Vous pouvez imaginer cela en réduisant le premier intervalle à un intervalle [0-1] en le divisant par 440, puis en l'étendant à un intervalle [0-130] en multipliant.
  3. Maintenant, vous savez comment aller [0-440]-[0-130] et cela signifie que pour aller [40-440]-[10-140] vous devez d'abord changer la base en soustrayant 40 multiplier par 130/440 puis ajoutez 10

Exemple:

>>> transform(40) 
10.0 
>>> transform(42) 
10.590909090909092 
>>> transform(220) 
63.181818181818187 
>>> transform(480) 
140.0 
7

Voulez-vous dire quelque chose comme ça, qui adapte les valeurs linéaire pour tenir dans la nouvelle gamme?

var transformRange = (value, r1, r2) => { 
    var scale = (r2.max - r2.min)/(r1.max - r1.min) 
    return (value - r1.min) * scale; 
} 

Exemple d'utilisation:

transformRange(100, {max: 150, min: 50}, {max: 1, min: 0}); => 0.5 
+0

Meilleure réponse. Facile à comprendre. – adev

Questions connexes