Como converter um número de um conjunto min \ max para outro conjunto min \ max? [fechadas]

19

Estou gerando terreno e tenho uma biblioteca permanente que me fornece números aleatórios entre -1 e +1. Eu quero converter isso na escala de 0 a 255. Qual é a maneira correta de fazer isso?

Thraka
fonte

Respostas:

23

A fórmula base é:

Result := ((Input - InputLow) / (InputHigh - InputLow))
          * (OutputHigh - OutputLow) + OutputLow;

Seu caso:

Resultado: = (( Entrada - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

A partir daqui, você pode otimizar a conversão se seus coeficientes forem estáticos, mas o compilador provavelmente fará isso sozinho.

Resultado: = (( Entrada - -1 ) / 2 ) * 255 + 0 ;

Resultado: = Entrada * 127,5 + 127,5 ;

Kromster diz apoio Monica
fonte
2
Essa resposta fez mais sentido para o meu cérebro programador. :) Um "obrigado" a todos por suas ótimas respostas.
Thraka
10

O intervalo -1para 1é um intervalo total de 2. Então, você precisa escalá-lo adequadamente para chegar 255. Algo assim:

(randomPerlin + 1.0) * 127.5

Então você adiciona primeiro 1, para 0..2depois multiplicar 127.5para obter um intervalo de0..255

bummzack
fonte
3

Através do poder da escala e do viés.

Do seu valor, subtraia o valor mínimo do seu intervalo. Isso fornecerá um valor no intervalo [0..2].

Divida isso pela largura do intervalo de origem, fornecendo um valor no intervalo [0..1].

Multiplique isso pela largura do intervalo de destino, fornecendo um valor no intervalo [0..255].

Adicione a base do intervalo de destino para obter um valor no intervalo de destino, que neste caso é o mesmo da etapa anterior.

Em suma:

            (v - (-1.0)) 
v' = 0 + ---------------- * (255 - 0)
          (1.0 - (-1.0))
Lars Viklund
fonte
3
oldRange = oldMax - oldMin
newRange = newMax - newMin

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

Espero que isto ajude.

functionoid
fonte
2

Traduza o intervalo de entrada para obter o mínimo em zero, adicionando 1 (o valor negativo da entrada mínima) -1 .. 1 -> 0 .. 2

Como o intervalo de saída começa com zero, não faça nada para isso.

Dimensione a nova faixa de entrada para que ela se ajuste à faixa de saída, isso é fácil, pois agora ambos começam em zero: multiplique o valor por 255/2 0..2 * 2/255 -> 0..255

Feito!

Exemplo:

0,5 será: (0,5 + 1) * 127,5 = 191,25 -0,5 será: (-0,5 + 1) * 127,5 = 63,75

Valmond
fonte
2

Digamos que xseja a entrada original e a ysaída esperada. Temos pelo menos dois pontos (x, y) (-1, 0) (1, 255)

Como queremos fazer uma interpolação linear , podemos olhar para a equação da forma y = m*x + c

Com acima de dois pontos, podemos resolver me c Uma vez feito isso, você obtém a equação de transformação.

Observe que este método também funciona para outros tipos de equações. Por exemplo, se você deseja uma interpolação exponencial ou quadrática.

Ankush
fonte
Em nosso campo, o significado comum de interpolação linear tende a ser que você misturar de forma linear entre duas quantidades com um fator de mistura como esta: v = (1-a)*x + (a)*y. Não vejo como essa resposta tenha muita relevância para a pergunta, pois tudo o que ele quer é um mapeamento de alcance.
Lars Viklund
a coisa é dois pontos em um plano que definem exclusivamente uma linha. podemos tratar o mapeamento de alcance como uma linha reta. e sabemos dois pontos nessa linha. resolvê-lo dará a equação da linha. pode ser interpolação linear não é a palavra certa aqui, mas eu queria dizer um conjunto de pontos internos entre esses dois pontos nesta linha.
Ankush