Aqui está como eu o entendo:
Qual porcentagem x
está em um intervalo
Vamos supor que você tenha um intervalo de 0
até 100
. Dado um número arbitrário desse intervalo, em que "porcentagem" desse intervalo ele se encontra? Isso deve ser bem simples, 0
seria 0%
, 50
seria 50%
e 100
seria 100%
.
Agora, o que se o intervalo foi 20
de 100
? Não podemos aplicar a mesma lógica acima (dividir por 100) porque:
20 / 100
não nos dá 0
( 20
deveria ser 0%
agora). Isso deve ser simples de corrigir, basta criar o numerador 0
para o caso de 20
. Podemos fazer isso subtraindo:
(20 - 20) / 100
No entanto, isso não funciona 100
mais porque:
(100 - 20) / 100
não nos dá 100%
. Novamente, podemos corrigir isso subtraindo também o denominador:
(100 - 20) / (100 - 20)
Uma equação mais generalizada para descobrir qual% x
está em um intervalo seria:
(x - MIN) / (MAX - MIN)
Escala de escala para outra escala
Agora que sabemos qual a porcentagem de um número em um intervalo, podemos aplicá-lo para mapear o número para outro intervalo. Vamos passar por um exemplo.
old range = [200, 1000]
new range = [10, 20]
Se tivermos um número no intervalo antigo, qual seria o número no novo intervalo? Digamos que o número seja 400
. Primeiro, descubra qual porcentagem 400
está dentro do intervalo antigo. Podemos aplicar nossa equação acima.
(400 - 200) / (1000 - 200) = 0.25
Então, 400
está na 25%
faixa antiga. Só precisamos descobrir qual é o número 25%
da nova faixa. Pense sobre o que 50%
de [0, 20]
é. Seria 10
certo? Como você chegou a essa resposta? Bem, podemos apenas fazer:
20 * 0.5 = 10
Mas e daí [10, 20]
? Precisamos mudar tudo 10
agora. por exemplo:
((20 - 10) * 0.5) + 10
uma fórmula mais generalizada seria:
((MAX - MIN) * PERCENT) + MIN
Para o exemplo original do que 25%
de [10, 20]
é:
((20 - 10) * 0.25) + 10 = 12.5
Então, 400
no intervalo [200, 1000]
mapearia 12.5
no intervalo[10, 20]
TLDR
Para mapear x
do intervalo antigo para o novo intervalo:
OLD PERCENT = (x - OLD MIN) / (OLD MAX - OLD MIN)
NEW X = ((NEW MAX - NEW MIN) * OLD PERCENT) + NEW MIN