Mappatura dei valori su una curva

1

Ho un valore compreso tra 0 e 8000 e voglio che questo numero si risolva in un altro numero compreso tra 0 e 2000. Potrei semplicemente dividerlo per 4 ma ho un bisogno speciale qui.

Per valori superiori a 4000 voglio che il valore mappato sia polarizzato verso il 2000. Ma per valori inferiori a 4000 voglio che il valore mappato sia polarizzato verso 0.

Questo è in realtà per un gioco in cui ti vengono dati punti bonus tra 0 e 2000 a seconda della velocità con cui completi l'attività. Quindi se sei molto veloce e lo fai in 7500 millisecondi dovresti ottenere 1875 punti (esattamente 7500/4). Se lo fai in 6000 millisecondi otterresti 1450 punti (poco meno di 6000/4). Se sei lento e lo fai in 1000 millisecondi otterresti 50 millisecondi (ben sotto 1000/4). L'idea è quella di premiare i giocatori veloci più dei giocatori lenti, ma lasciare che i giocatori lenti sentano di aver raggiunto qualcosa. Sento che una mappatura dei valori "facilitata" raggiungerebbe questo obiettivo.

Spero che abbia senso. Puoi aiutarmi a capire il codice che raggiunge questo?

    
posta Newt-7 25.01.2014 - 21:20
fonte

1 risposta

3

Prova la funzione sigmoid :

link

Mapperà i valori da -(range/2) to +(range/2) a una scala tra 0.0 e 1.0, con il punto medio a 0 *). La cosa bella è che cambiando il range si ottengono curve diverse. Ecco un esempio con valori da 1-2000 mappati sull'uso del sigmoid:

Ecco due esecuzioni della funzione utilizzando diversi valori dell'intervallo (r):

  ms     r=6    r=20
    0      94       0
  500     135       0
 1000     190       1
 1500     265       3
 2000     364      13
 2500     490      45
 3000     641     151
 3500     814     445
 4000    1000    1000
 4500    1186    1555
 5000    1359    1849
 5500    1510    1955
 6000    1636    1987
 6500    1735    1997
 7000    1810    1999
 7500    1865    2000
 8000    1906    2000

*) in realtà, esegue il mapping tra -infinity a + infinity, ma per il tuo scopo selezionare un intervallo compreso tra -10 / + 10 e -30 / + 30 dovrebbe funzionare.

    
risposta data 26.01.2014 - 01:21
fonte

Leggi altre domande sui tag