public double ComputeTimeToReach(double x, double acceleration) { var lastKnown = KnownPositions.Last(p => p.X <= x); var sol = ResolveSecondOrderEq(0.5 * acceleration, lastKnown.Speed, lastKnown.X - x); return(sol.Single(s => s >= 0)); }
public MyCar() { KnownPositions.Add(new Position { Time = 0, Speed = 0, X = 0 }); }
public Position ComputePositionAtTime(double t, double acceleration) { var lastKnown = KnownPositions.Last(x => x.Time <= t); var elapsedTime = t - lastKnown.Time; return(new Position { Time = t, Speed = lastKnown.Speed + elapsedTime * acceleration, X = lastKnown.X + lastKnown.Speed * elapsedTime + 0.5 * acceleration * elapsedTime * elapsedTime, }); }
public double ComputeTimeToReach(double x) { var previousPosition = KnownPositions.Last(p => p.X <= x); var nextPosition = KnownPositions.First(p => p.X >= x); var dx = nextPosition.X - previousPosition.X; var dt = nextPosition.Time - previousPosition.Time; if (dx == 0) { return(previousPosition.Time); } return(previousPosition.Time + (x - previousPosition.X) * dt / dx); }
public Position ComputePositionAtTime(double t) { var exactPosition = KnownPositions.SingleOrDefault(x => Math.Abs(x.Time - t) <= double.Epsilon); if (exactPosition != null) { return(exactPosition); } var previousPosition = KnownPositions.Last(x => x.Time <= t); var nextPosition = KnownPositions.First(x => x.Time >= t); var speed = (nextPosition.X - previousPosition.X) / (nextPosition.Time - previousPosition.Time); return(new Position { Time = t, Speed = speed, X = previousPosition.X + speed * (t - previousPosition.Time), }); }