# Calculation of distance while switching between two speeds

There are two speed values, that are used by moving object. After a while speed switching occurs from V1 to V2. I need the formula that can be used for calculation of current distance (at specified time).

Input variable:

• T - Current time

Constants:

• V1 - first speed
• V2 - second speed
• Ts - switching time between V1 and V2
• P - switching power

Output variable:

• S = ?

I tried to use next formula: S = Lerp[Clamp(T / Ts, 0, 1) ^ P), V1, V2] * T

But in this case the moving object will be returned back after time and moves forward again.

Probably acceleration should be used in the formula?

• Explain switching power. This is more a math question than a coding or gamedev question. I see it this way: you have V1 and V2, and V1 is constant until Ts (an horizon) is reached. Then V2 is constant too from that point. What is P? Commented Aug 22, 2019 at 16:45
• P is how fast switching will be occurred. In my example formula it's interpolation alpha Commented Aug 22, 2019 at 17:15

Rewriting your speed transition formula as

float blend = clamp((currentTime - startTime)/transitionDuration), 0, 1);

Vector3 currentVelocity = startVelocity + (endVelocity - startVelocity) * blend;


Then during the transition we're applying a constant acceleration of:

Vector3 acceleration = (endVelocity - startVelocity) / transitionDuration;


Now we can integrate this to get the total displacement from the starting position at time T=0 in three parts.

First, for currentTime <= startTime,

Vector3 currentPosition= startPosition + startVelocity * currentTime;


Which at the end of this interval reaches a value of:

Vector3 accelerationStartPosition = startPosition + startVelocity * startTime;


Second, for startTime < currentTime <= startTime + transitionDuration, we can use the formula for position under constant acceleration:

$$\vec p(\Delta t) = \vec p_0 + \vec v_0 \cdot \Delta t + \frac 1 2 \vec a \cdot \Delta t^2$$

in code:

float transitionTime = currentTime - startTime;

currentPosition = accelerationStartPosition
+ startVelocity * transitionTime
+ 0.5f * acceleration * transitionTime*transitionTime;


Which we can simplify to:

 currentPosition = startPosition + startVelocity * currentTime
+ 0.5f * acceleration * transitionTime*transitionTime;


Which again, at the end of the transition interval, takes a value of:

float endTime = startTime + transitionDuration;

Vector3 transitionEndPosition = startPosition
+ startVelocity * endTime
+ 0.5f * acceleration * transitionDuration*transitionDuration;


And lastly, for currentTime > startTime + transitionDuration:

currentPosition = transitionEndPosition + endVelocity * (currentTime - endTime);