Come convertire un numero da un set min \ max ad un altro set min \ max? [chiuso]


19

Sto generando terreno e ho una libreria perlin che mi sta dando numeri casuali tra -1 e +1. Voglio convertirlo nella scala 0-255. Qual è il modo corretto per farlo?

Risposte:


23

La formula di base è:

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

Il tuo caso:

Risultato: = (( Input - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

Da qui puoi ottimizzare la conversione se i tuoi coefficienti sono statici, ma probabilmente anche il compilatore lo farà da solo.

Risultato: = (( Input - -1 ) / 2 ) * 255 + 0 ;

Risultato: = input * 127,5 + 127,5 ;


2
Questa risposta aveva più senso per il mio cervello programmatore. :) Un "grazie" a tutti gli altri per le loro ottime risposte.
Thraka,

10

L'intervallo -1a 1è un intervallo totale di 2. Quindi è necessario ridimensionarlo in modo appropriato per arrivare a 255. Qualcosa come questo:

(randomPerlin + 1.0) * 127.5

Quindi prima aggiungi 1, per arrivare a 0..2poi moltiplicare 127.5per ottenere un intervallo di0..255


3

Attraverso il potere del ridimensionamento e della distorsione.

Dal tuo valore, sottrai il valore minimo del tuo intervallo. Questo ti darà un valore nell'intervallo [0..2].

Dividilo per la larghezza dell'intervallo di origine, dandoti un valore nell'intervallo [0..1].

Moltiplicalo per la larghezza dell'intervallo target, dandoti un valore nell'intervallo [0..255].

Aggiungi la base dell'intervallo target per ottenere un valore nell'intervallo target, che in questo caso è lo stesso del passaggio precedente.

In sintesi:

            (v - (-1.0)) 
v' = 0 + ---------------- * (255 - 0)
          (1.0 - (-1.0))

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

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

Spero che sia di aiuto.


2

Traduci l' intervallo di input in modo da ottenere il minimo a zero aggiungendo 1 (il valore negativo dell'ingresso minimo) -1 .. 1 -> 0 .. 2

Poiché l'intervallo di output inizia con zero, non fare nulla per quello.

Ridimensionare il nuovo intervallo di input in modo che si adatti al range di output, questo è facile in quanto entrambi iniziano a zero: moltiplicare il valore per 255/2 0..2 * 2/255 -> 0..255

Fatto!

Esempio:

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


2

Diciamo che xè l'input originale e l' youtput previsto. Abbiamo almeno due punti (x, y) (-1, 0) (1, 255)

Dato che vogliamo fare un'interpolazione lineare , possiamo esaminare l'equazione della forma y = m*x + c

Con due punti sopra, possiamo risolvere me, una c volta fatto, ottieni l'equazione di trasformazione.

Nota che questo metodo funziona anche per altri tipi di equazioni. ad es. se si desidera un'interpolazione esponenziale o quadratica.


Nel nostro campo, il significato comune di interpolazione lineare tende ad essere che si mescolano in modo lineare tra due unità, il cui fattore di miscelazione come questo: v = (1-a)*x + (a)*y. Non vedo come questa risposta abbia molta rilevanza per la domanda posta in quanto tutto ciò che vuole è una mappatura di intervallo.
Lars Viklund,

la cosa è che due punti in un piano definiscono in modo univoco una linea. possiamo considerare la mappatura del range come una linea retta. e conosciamo due punti su quella linea. risolverlo darà l'equazione di linea. Forse interpolazione lineare non è la parola giusta qui, ma volevo intendere un insieme di punti interni tra quei due punti su questa linea.
Ankush,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.