คุณยังไม่ได้รับข้อมูลมากพอที่จะบอกช่วงที่คุณต้องการเช่นว่ามันจะต่อยอดไม่ว่าคุณต้องการความก้าวหน้าทางเรขาคณิตหรือไม่
สิ่งแรกที่คุณต้องการทำคือหาตัวเลขที่แปรผันตามปริมาณความเร็วที่คุณต้องการสูญเสีย (ไม่จำเป็นต้องเหมือนเดิม แต่ควรลดลงเมื่อความเร็วเพิ่มขึ้นเพื่อทำให้สัดส่วนกับการสูญเสียของคุณ) วิธีมาตรฐานในการทำเช่นนั้นคือรับส่วนกลับ :
temp = 1 / currentVelocity;
ทีนี้, สำหรับ 100 คุณจะได้ 0.01, สำหรับ 200 คุณจะได้ 0.005, สำหรับ 300 คุณจะได้ 0.0033 เป็นต้นไป
ตอนนี้คุณเพียงแค่ต้องปรับจำนวนนั้นเป็นสิ่งที่คุณต้องการโดยการคูณมัน ดังนั้น
k = 3000;
newVelocity = temp * k;
จะให้ 20 กับ 300 ของคุณ แต่จะให้ 15 ถึง 200 แทน 10 ซึ่งอาจใช้ได้สำหรับคุณในกรณีนี้คุณไม่จำเป็นต้องอ่านเพิ่มเติม คุณสามารถปรับ k ตามที่คุณต้องการ แต่คุณอาจไม่ได้ตัวเลขในแบบที่คุณชอบเว้นแต่คุณจะทำอะไรเพิ่มอีกเล็กน้อยเช่นใช้ความก้าวหน้าทางเรขาคณิตหรือเปลี่ยนฐานเพื่อเพิ่ม ฉันจะไม่เข้าสู่ความก้าวหน้าทางเรขาคณิตที่นี่ แต่ถ้าคุณต้องการเปลี่ยนฐานคุณทำได้ดังนี้:
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
ไงบ้าง?