Ne tür bir aralık istediğinizi (ör. Sınırlandırılmış olup olmadığını, geometrik ilerleme isteyip istemediğinizi vb.) Söylemek için yeterli bilgi vermediniz.
Yapmak istediğiniz ilk şey, kaybetmek istediğiniz hız miktarıyla orantılı bir sayı elde etmektir (aynı olmak zorunda değildir, ancak hızınız kaybınızla orantılı hale getirmek için arttıkça azalmalıdır). Bunu yapmanın standart yolu karşılıklılığı almaktır :
temp = 1 / currentVelocity;
Şimdi, 100 için 0.01, 200 için 0.005, 300 için 0.0033 ve benzeri olacak.
Şimdi bu sayıyı çarparak gerçekten istediğiniz her şeye ayarlamanız yeterlidir. Yani
k = 3000;
newVelocity = temp * k;
300 için 20'nizi verir, ancak 10 yerine 200 için 15 verir. Bu sizin için iyi olabilir, bu durumda daha fazla okumaya gerek yoktur. K'yi istediğiniz gibi ayarlayabilirsiniz, ancak geometrik ilerleme uygulama veya biraz artırmak için tabanı değiştirme gibi biraz daha yapmadığınız sürece sayıları istediğiniz gibi alamayabilirsiniz. Burada geometrik ilerlemelere girmeyeceğim, ancak tabanı değiştirmek istiyorsanız, bunu aşağıdaki gibi yaparsınız:
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)
Bu size ilk olarak sorunuzda aradığınız aralığı sağlayacaktır, 300 -> 10, 200 -> 20 kaybı. FYI 100 -> 40 kaybı ve 50 -> 80 (!) Kaybı (1) ve (2) satırlarında yaptığım şey çıkarma işleminizi kısıtlamanız gerekiyor.
Bu soruna yaklaşmanın başka yolları da var elbette ki eminim ki benden daha matematiksel olarak usta olanlar burada yayınlayacaklar.
log(myVelocity + 1) * N
?