private static void GetNextGridPoint_CountGreater1(ITrack track, ICar car, IList <Point> routeGridPoints, Point middleGridPoint,
                                                           out uint nrBacktracks, out Point gridPoint)
        {
            nrBacktracks = 0;
            // get candidate grid point set from car and then remove those that are invalid because of the track and remove the current point
            IList <Point> candidateGridPointsFiltered = ComputerDriverHelper.FilterCandidatePoints_RemoveInvalids
                                                            (track, car.GetCandidateGridPoints(routeGridPoints), routeGridPoints);

            if (candidateGridPointsFiltered.Count == 0)
            {
                // remark this is not a solution, because we do not have a better grid point
                nrBacktracks = 1;
                return;
            }

            // now find the "optimum" among the valid candidate grid points
            bool optimumPointFound = false;

            ComputerDriverHelper.GetNextGridPoint_CountGreater1_FindOptimum(routeGridPoints, candidateGridPointsFiltered, middleGridPoint, true, out optimumPointFound, out gridPoint);
            if (optimumPointFound == false)
            {
                // no optimum was found, this can happen because all grid points have an "invalid" direction
                // take one of the closest to the current point, ignoring the direction
                IList <Point> closestPoints2CurrentPoint = VectorMath.FindPointsInTheListClosest2FixPoint(routeGridPoints.Last(), candidateGridPointsFiltered);
                gridPoint = closestPoints2CurrentPoint[0];
            }
        }
        private void CalculateBestRoute(ITrack track, ICar car, IList <Point> routeGridPoints, Point middleGridPoint)
        {
            IList <Point> candidateGridPoints         = GetCandidatePoints(track, car, routeGridPoints);
            IList <Point> candidateGridPointsFiltered = ComputerDriverHelper.FilterCandidatePoints_RemoveInvalids
                                                            (track, candidateGridPoints, routeGridPoints);

            if (candidateGridPointsFiltered.Count == 0)
            {
                // backtrack, because we are at a dead end
                routeGridPoints.RemoveAt(routeGridPoints.Count - 1);
                return;
            }

            // we only take candidate grid points with a quadrant valid direction
            IList <Point> candidateGridPointsFilteredQuadrantDir = ComputerDriverHelper.FilterCandidatePoints_RemoveUnfavorableDir
                                                                       (candidateGridPointsFiltered, routeGridPoints, middleGridPoint);

            for (int index = 0; index < candidateGridPointsFilteredQuadrantDir.Count; index++)
            {
                Point newPoint = candidateGridPointsFilteredQuadrantDir[index];

                if (track.CheckIfRaceIsFinished(routeGridPoints, newPoint))
                {
                    // we have found one complete route that finishes
                    routeGridPoints.Add(newPoint);
                    // now compare if this is better than the previous one
                    if (IsThisBetterThanCurrentBestRoute(routeGridPoints))
                    {
                        // yes it is better -> overwrite
                        mCurrentBestRoute = routeGridPoints.ToList();
                    }
                    else
                    {
                        // ignore it
                        routeGridPoints.RemoveAt(routeGridPoints.Count - 1);
                    }
                }
                else
                {
                    // continue route to finish the race
                    routeGridPoints.Add(newPoint);
                    CalculateBestRoute(track, car, routeGridPoints, middleGridPoint);
                }
            }
        }
        /// <summary>
        /// get the next grid point for scenario: count = 1 - choose first movement vector
        /// </summary>
        private static void GetNextGridPoint_Count1(ITrack track, ICar car, IList <Point> routeGridPoints,
                                                    out uint nrBacktracks, out Point gridPoint)
        {
            // handle start, i.e. choose first vector
            // remove candidate points that are not valid
            IList <Point> candidateGridPointsFiltered = ComputerDriverHelper.FilterCandidatePoints_RemoveInvalids
                                                            (track, car.GetCandidateGridPoints(routeGridPoints), routeGridPoints);

            if (candidateGridPointsFiltered.Count > 0)
            {
                nrBacktracks = 0;
                gridPoint    = ChooseFirstMovementEndPoint(candidateGridPointsFiltered);
            }
            else
            {
                // not really a solution... but seems never to happen
                nrBacktracks = 1;
            }
        }
示例#4
0
        private void GetNextGridPoint_CountGreater1_Backtrack(ITrack track, ICar car, IList <Point> routeGridPoints, Point middleGridPoint,
                                                              out uint nrBacktracks, out Point gridPoint)
        {
            bool foundOne = false;

            nrBacktracks = 0;                   // only a dummy value

            while (foundOne == false)
            {
                mBacktrackLevel++;
                nrBacktracks = mBacktrackLevel;

                // doing backtracking of routeGridPoints
                IList <Point> routeGridPointsLessTheLast = routeGridPoints.ToList();
                for (uint index = 0; index < mBacktrackLevel; index++)
                {
                    // add those that we backtrack to backtrack list so that we do not try them again
                    if (mBacktrackedRouteGridPoints.Contains(routeGridPointsLessTheLast[routeGridPointsLessTheLast.Count - 1]) == false)
                    {
                        mBacktrackedRouteGridPoints.Add(routeGridPointsLessTheLast[routeGridPointsLessTheLast.Count - 1]);
                    }
                    routeGridPointsLessTheLast.RemoveAt(routeGridPointsLessTheLast.Count - 1);
                }

                IList <Point> candidateGridPointsFilteredLessTheLast = ComputerDriverHelper.FilterCandidatePoints_RemoveInvalids
                                                                           (track, car.GetCandidateGridPoints(routeGridPointsLessTheLast), routeGridPointsLessTheLast);
                // remove the backtracked points
                IList <Point> nextFilter = candidateGridPointsFilteredLessTheLast.Except(mBacktrackedRouteGridPoints).ToList();
                if (nextFilter.Count > 0)
                {
                    foundOne = true;
                    bool carefulOptimumPointFound;
                    // we are too risky, use the careful computer driver -> option 4: closest = true
                    ComputerDriverHelper.GetNextGridPoint_CountGreater1_FindOptimum(routeGridPointsLessTheLast, nextFilter,
                                                                                    middleGridPoint, true, out carefulOptimumPointFound, out gridPoint);
                }
            }
        }