Sie haben nicht wirklich genug Informationen angegeben, um zu sagen, welche Art von Bereich Sie möchten, dh ob er begrenzt ist, ob Sie einen geometrischen Verlauf wünschen usw.
Als erstes möchten Sie eine Zahl ableiten, die proportional zur Geschwindigkeit ist, die Sie verlieren möchten (sie muss nicht gleich sein, sollte jedoch mit zunehmender Geschwindigkeit abnehmen, um sie proportional zu Ihrem Verlust zu machen). Der Standardweg, dies zu tun, ist das Gegenteil :
temp = 1 / currentVelocity;
Jetzt haben Sie für 100 0,01, für 200 0,005, für 300 0,0033 und so weiter.
Jetzt müssen Sie diese Zahl nur noch an das anpassen, was Sie wirklich wollen, indem Sie sie multiplizieren. So
k = 3000;
newVelocity = temp * k;
Sie erhalten 20 für 300, aber 15 für 200 statt 10. Dies kann für Sie in Ordnung sein. In diesem Fall müssen Sie nicht weiter lesen. Sie können k nach Belieben anpassen, aber Sie erhalten möglicherweise keine Zahlen, wie Sie sie mögen, es sei denn, Sie tun etwas mehr, z. B. implementieren Sie eine geometrische Progression oder ändern Sie die Basis für die Erhöhung. Ich werde hier nicht auf geometrische Progressionen eingehen, aber wenn Sie die Basis ändern möchten, gehen Sie wie folgt vor:
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)
Dadurch erhalten Sie den Bereich, nach dem Sie ursprünglich in Ihrer Frage gefragt haben: 300 -> Verlust von 10, 200 -> Verlust von 20. FYI 100 -> Verlust von 40 und 50 -> Verlust von 80 (!), Was bedeutet, dass Sie Ich müsste Ihre Subtraktion einschränken - was ich in den Zeilen (1) und (2) getan habe.
Es gibt natürlich auch andere Möglichkeiten, dieses ganze Problem anzugehen, und ich bin sicher, dass diejenigen, die mathematisch versierter sind als ich, hier posten werden.
log(myVelocity + 1) * N
?