Bạn đã không thực sự cung cấp đủ thông tin để cho biết loại phạm vi nào bạn muốn, nghĩa là nó có giới hạn hay không, liệu bạn có muốn tiến triển hình học, v.v.
Điều đầu tiên bạn muốn làm là lấy một con số tỷ lệ thuận với tốc độ bạn muốn mất (nó không nhất thiết phải giống nhau, nhưng nó sẽ giảm khi tốc độ tăng để tỷ lệ thuận với tổn thất của bạn). Cách tiêu chuẩn để làm điều đó là lấy đối ứng :
temp = 1 / currentVelocity;
Bây giờ, với 100 bạn sẽ có 0,01, với 200 bạn sẽ có 0,005, với 300 bạn sẽ có 0,0033, v.v.
Bây giờ bạn chỉ cần điều chỉnh số đó thành bất cứ điều gì bạn thực sự muốn, bằng cách nhân nó. Vì thế
k = 3000;
newVelocity = temp * k;
sẽ cung cấp cho bạn 20 cho 300, nhưng nó sẽ cung cấp cho bạn 15 cho 200 chứ không phải 10. Điều này có thể tốt cho bạn, trong trường hợp đó bạn không cần phải đọc thêm. Bạn có thể điều chỉnh k theo ý muốn nhưng bạn có thể không nhận được số theo cách bạn thích trừ khi bạn thực hiện thêm một chút, chẳng hạn như thực hiện tiến trình hình học hoặc thay đổi cơ sở để tăng. Tôi sẽ không đi vào tiến trình hình học ở đây, nhưng nếu bạn muốn thay đổi cơ sở, bạn làm như sau:
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)
Điều này sẽ cung cấp cho bạn phạm vi bạn đã yêu cầu ban đầu trong câu hỏi của mình, 300 -> mất 10, 200 -> mất 20. FYI 100 -> mất 40 và 50 -> mất 80 (!) Có nghĩa là bạn 'Cần hạn chế phép trừ của bạn - đó là những gì tôi đã thực hiện trong các dòng (1) và (2).
Tất nhiên, có nhiều cách khác để tiếp cận toàn bộ vấn đề này, mà tôi chắc chắn rằng những người giỏi toán hơn tôi, sẽ đăng ở đây.
log(myVelocity + 1) * N
nào?