public bool IsValid(IList <Point> routeGridPoints, Point gridPointClicked)
        {
            if ((routeGridPoints == null) | (routeGridPoints.Count == 0))
            {
                // very first click - nothing to validate here
                return(true);
            }

            if (routeGridPoints.Count == 1)
            {
                return(CarHelper.CheckSecondPoint(routeGridPoints.Last(), gridPointClicked));
            }

            return(CarHelper.CheckNextPoint
                       (routeGridPoints[routeGridPoints.Count - 2], routeGridPoints.Last(), gridPointClicked, mAcceleration));
        }
        /// <summary>
        /// Get the list of candidate grid points, i.e. the possible grid points for the next move
        /// </summary>
        /// <returns></returns>
        public IList <Point> GetCandidateGridPoints(IList <Point> routeGridPoints)
        {
            IList <Point> cgp;

            if (routeGridPoints.Count == 0)
            {
                // nothing to do, return empty list
                cgp = new List <Point>();
            }
            else if (routeGridPoints.Count == 1)
            {
                // special case, we are on the starting line
                Point  currentPosition = routeGridPoints.Last();
                double leftX           = currentPosition.X - mAcceleration;
                double rightX          = currentPosition.X + mAcceleration;
                double topY            = currentPosition.Y - mAcceleration;
                double bottomY         = currentPosition.Y - 1;         // need to be above the starting line

                cgp = AddCandidates(leftX, rightX, topY, bottomY);
            }
            else
            {
                // standard case, we have a movement vector
                Point currentPosition  = routeGridPoints.Last();
                Point previousPosition = routeGridPoints[routeGridPoints.Count - 2];
                Point nextMiddlePoint  = CarHelper.CalculateNextMiddlePoint(previousPosition, currentPosition);

                // now collect all points that are around the nextMiddlePoint, including the nextMiddlePoint
                double leftX   = nextMiddlePoint.X - mAcceleration;
                double rightX  = nextMiddlePoint.X + mAcceleration;
                double topY    = nextMiddlePoint.Y - mAcceleration;
                double bottomY = nextMiddlePoint.Y + mAcceleration;

                cgp = AddCandidates(leftX, rightX, topY, bottomY);
            }

            return(cgp);
        }