# 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? – Hatoru Hansou Aug 22 '19 at 16:45
• P is how fast switching will be occurred. In my example formula it's interpolation alpha – Broly Aug 22 '19 at 17:15

## 1 Answer

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);