コード例 #1
0
        private List <RaceLap> GetLapsByLapNumber(int lapNumber, bool searchDownForPreviousLapsForEveryDriver)
        {
            List <RaceLap> ret = new List <RaceLap>();

            ret = Laps.Get(lapNumber);

            if (searchDownForPreviousLapsForEveryDriver)
            {
                List <Driver> drivers = Laps.GetDrivers().ToList();

                foreach (var lap in ret)
                {
                    if (drivers.Contains(lap.Driver))
                    {
                        drivers.Remove(lap.Driver);
                    }
                }

                int lastDriversCount = drivers.Count;
                while (drivers.Count > 0)
                {
                    Driver driver = drivers[0];
                    for (int i = lapNumber - 1; i > 0; i--)
                    {
                        RaceLap lap = Laps.Get(i, driver);
                        if (lap != null)
                        {
                            ret.Add(lap);
                            drivers.Remove(driver);
                            break;
                        }
                    }

                    if (lastDriversCount == drivers.Count)
                    {
                        throw new Exception("Cannot get last previous lap of driver " + driver.NameSurname + ". Invalid data.");
                    }
                    else
                    {
                        lastDriversCount = drivers.Count;
                    }
                }
            }

            return(ret);
        }
コード例 #2
0
        private void EvaluateLaps(out RaceLap zeroLapOfPolePosition)
        {
            Minner <RaceLap> m = new Minner <RaceLap>(
                (RaceLap l) => l.CrossedAtTime
                );
            RaceLap lapZero;

            var drivers = Laps.GetDrivers();

            foreach (var driver in drivers)
            {
                RecalculateLapTimesOfDriver(driver, out lapZero);
                m.Add(lapZero as RaceLap);
                Laps.Remove(0, driver);
                RefreshLinksOfDriver(driver);
            }

            zeroLapOfPolePosition = m.MinimumItem;
        }
コード例 #3
0
        public void RecalculateLapTimes()
        {
            var drivers = Laps.GetDrivers();

            // order laps of all drivers by time
            foreach (var driver in drivers)
            {
                var laps = Laps[driver];
                laps.Sort(new Lap.ByCrossedAtTimeComparer());
                for (int i = 1; i < laps.Count; i++)
                {
                    Time bef  = laps[i - 1].CrossedAtTime;
                    Time curr = laps[i].CrossedAtTime;
                    Time diff = curr - bef;
                    laps[i].Time      = diff;
                    laps[i].LapNumber = i;
                }

                Laps.Remove(0, driver);
            }
        }
コード例 #4
0
        public void RefreshLinks()
        {
            var drivers = Laps.GetDrivers();

            NonRacePositionCollection bestLaps = new NonRacePositionCollection();

            // order laps of all drivers by time
            foreach (var driver in drivers)
            {
                var laps = Laps[driver];
                LapProvider.ReLinkByCrossedAt(laps);
                LapProvider.ReLinkByTime(laps);

                laps.Sort(new Lap.ByLapTimeComparer());
                if (laps.Count > 0)
                {
                    bestLaps.Add(laps[0]);
                }
            }

            // get positions
            bestLaps.Sort(new Lap.ByLapTimeComparer());
            Positions = bestLaps;
        }
コード例 #5
0
        public void RegisterPitLaps()
        {
            this.PitLaps.Clear();

            var drivers = Laps.GetDrivers();

            foreach (var driver in drivers)
            {
                var laps = Laps[driver];
                laps.ForEach(i => i.PitState = RaceLap.ePitState.None);
                laps.Sort(new Lap.ByCrossedAtTimeComparer());

                for (int i = 1; i < laps.Count - 1; i++)
                {
                    if (laps[i].IsPitted == false)
                    {
                        continue;
                    }

                    RaceLap current = laps[i];
                    RaceLap next    = laps[i + 1];
                    this.PitLaps.Add(current, next);

                    if (current.PitState == RaceLap.ePitState.Exit)
                    {
                        current.PitState = RaceLap.ePitState.ExitAndEntry;
                    }
                    else
                    {
                        current.PitState = RaceLap.ePitState.Entry;
                    }

                    next.PitState = RaceLap.ePitState.Exit;
                }
            }
        }