예제 #1
0
        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));
        }
예제 #2
0
 public MyCar()
 {
     KnownPositions.Add(new Position
     {
         Time  = 0,
         Speed = 0,
         X     = 0
     });
 }
예제 #3
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,
            });
        }
예제 #4
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);
        }
예제 #5
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),
            });
        }