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