예제 #1
0
        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);
        }
예제 #2
0
        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),
            });
        }