원하는 범위, 즉 제한이 있는지, 기하학적 진행이 필요한지 등을 알려주는 정보가 충분하지 않습니다.
가장 먼저하고 싶은 것은 잃고 자하는 속도에 비례하는 숫자를 얻는 것입니다 (동일 필요는 없지만 속도가 증가함에 따라 감소하면 손실에 비례합니다). 이를 수행하는 표준 방법은 역수 를 취하는 것입니다 .
temp = 1 / currentVelocity;
이제 100의 경우 0.01, 200의 경우 0.005, 300의 경우 0.0033 등이됩니다.
이제 숫자를 곱하여 원하는 숫자로 조정하면됩니다. 그래서
k = 3000;
newVelocity = temp * k;
20을 300으로 줄 것이지만 10이 아니라 200을 15로 줄 것입니다.이 경우 더 이상 읽을 필요가 없습니다. 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
습니까?