आपको वास्तव में यह बताने के लिए पर्याप्त जानकारी नहीं दी गई है कि आप किस प्रकार की सीमा चाहते हैं, अर्थात क्या यह छाया हुआ है, क्या आप ज्यामितीय प्रगति चाहते हैं, आदि।
पहली चीज जो आप करना चाहते हैं, वह है कि आप जिस गति को खोना चाहते हैं, उसकी संख्या के अनुपात में एक संख्या है (यह उतना ही नहीं है, लेकिन इसे घटाना चाहिए क्योंकि यह गति आपके नुकसान के आनुपातिक बनाने के लिए बढ़ जाती है)। मानक तरीका यह है कि पारस्परिक लेना है :
temp = 1 / currentVelocity;
अब, 100 के लिए आपके पास 0.01, 200 के लिए आपके पास 0.005, 300 के लिए आपके पास 0.0033 और इतने पर होंगे।
अब आपको बस उस नंबर को समायोजित करने की आवश्यकता है जो आप वास्तव में चाहते हैं, इसे गुणा करके। इसलिए
k = 3000;
newVelocity = temp * k;
आपको 300 के लिए अपना 20 देगा, लेकिन यह आपको 10. के बजाय 200 के लिए 15 देगा। यह आपके लिए ठीक हो सकता है, उस स्थिति में आपको आगे पढ़ने की आवश्यकता नहीं है। आप अपनी इच्छानुसार कश्मीर को समायोजित कर सकते हैं लेकिन आपको संख्याएँ तब तक नहीं मिल सकती हैं जब तक आप उन्हें पसंद नहीं करते हैं जब तक कि आप थोड़ा अधिक नहीं करते हैं, जैसे कि ज्यामितीय प्रगति को लागू करना, या वृद्धि के लिए आधार को बदलना। मैं यहाँ ज्यामितीय प्रगति में नहीं जा रहा हूँ, लेकिन यदि आप आधार बदलना चाहते हैं, तो आप इसे निम्नानुसार करते हैं:
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)
यह आपको आपके सवाल के मूल रूप से आपके द्वारा पूछे गए रेंज के साथ प्रदान करेगा, 300 -> 10 का नुकसान, 200 -> 20 का नुकसान। FYI करें 100 -> 40 का नुकसान, और 50 -> 80 का नुकसान (!) जिसका अर्थ है आप अपने घटाव को प्रतिबंधित करने की आवश्यकता है - जो मैंने लाइनों (1) और (2) में किया है।
इस पूरी समस्या से निपटने के अन्य तरीके भी हैं, निश्चित रूप से, मुझे यकीन है कि मैं की तुलना में उन गणितीय रूप से अधिक अनुकूल हूं, यहां पोस्ट करूंगा।
log(myVelocity + 1) * N
?