Non hai davvero fornito abbastanza informazioni per dire che tipo di intervallo vuoi, cioè se è limitato, se vuoi progressione geometrica, ecc.
La prima cosa che vuoi fare è derivare un numero proporzionale alla quantità di velocità che vuoi perdere (non deve essere la stessa, ma dovrebbe diminuire all'aumentare della velocità per renderlo proporzionale alla tua perdita). Il modo standard per farlo è prendere il reciproco :
temp = 1 / currentVelocity;
Ora, per 100 avrai 0,01, per 200 avrai 0,005, per 300 avrai 0,0033 e così via.
Ora devi solo adattare quel numero a quello che vuoi davvero, moltiplicandolo. Così
k = 3000;
newVelocity = temp * k;
ti darà i tuoi 20 per 300, ma ti darà 15 per 200 anziché 10. Questo potrebbe andare bene per te, in tal caso non dovrai leggere più a fondo. Puoi regolare k come preferisci ma potresti non ottenere i numeri come preferisci a meno che tu non faccia un po 'di più, come implementare la progressione geometrica o cambiare la base per aumentare. Non ho intenzione di entrare in progressioni geometriche qui, ma se vuoi cambiare la base, lo fai come segue:
base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!
k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
velocityLoss = currentVelocity; //(2)
Questo ti fornirà l'intervallo inizialmente richiesto nella tua domanda, 300 -> perdita di 10, 200 -> perdita di 20. FYI 100 -> perdita di 40 e 50 -> perdita di 80 (!) Che significa che dovrei limitare la tua sottrazione - che è quello che ho fatto nelle righe (1) e (2).
Ci sono altri modi per affrontare l'intero problema, ovviamente, che sono sicuro che quelli più matematicamente abili di me pubblicheranno qui.
log(myVelocity + 1) * N
?