private void RecalculateLapTimesOfDriver(Driver driver, out RaceLap lapZero)
        {
            lapZero = null;
            var laps = Laps[driver];

            if (laps.Count == 0)
            {
                return;
            }

            laps.Sort(new Lap.ByCrossedAtTimeComparer());
            lapZero = laps[0];

            Time lastCrossedAt = laps[0].CrossedAtTime;

            for (int i = 0; i < laps.Count; i++)
            {
                laps[i].LapNumber = i;
                if (i == 0)
                {
                    continue;
                }

                Time diff = laps[i].CrossedAtTime - lastCrossedAt;
                laps[i].Time = diff;

                lastCrossedAt = laps[i].CrossedAtTime;
            }
        }
Exemple #2
0
        /// <summary>
        /// Gets the specified lap by lapnumber and driver.
        /// </summary>
        /// <param name="lapNumber">The lap number.</param>
        /// <param name="driver">The driver.</param>
        /// <returns></returns>
        public RaceLap Get(int lapNumber, Driver driver)
        {
            var     l   = this[GetLapIndex(lapNumber)];
            RaceLap ret = l.FirstOrDefault(i => i.Driver == driver);

            return(ret);
        }
Exemple #3
0
        /// <summary>
        /// Adds the lap.
        /// </summary>
        /// <param name="lapNumber">The lap number.</param>
        /// <param name="lap">The lap.</param>
        public void AddLap(int lapNumber, RaceLap lap)
        {
            while (inner.Count <= lapNumber)
            {
                inner.Add(new List <RaceLap>());
            }

            inner[GetLapIndex(lapNumber)].Add(lap);
        }
        public int Sum(Func <RaceLap, int> selector, Func <RaceLap, RaceLap> enumerator)
        {
            int     ret     = selector(this);
            RaceLap prevLap = enumerator(this);

            if (prevLap != null)
            {
                ret += prevLap.Sum(selector, enumerator);
            }

            return(ret);
        }
        /// <summary>
        /// Adds the pit specified by enter and exit lap.
        /// </summary>
        /// <param name="firstLap">The first lap.</param>
        /// <param name="secondLap">The second lap.</param>
        public void Add(RaceLap firstLap, RaceLap secondLap)
        {
            RacePit item = new RacePit();

            item.FirstLap  = firstLap;
            item.SecondLap = secondLap;
            item.Time      = item.FirstLap.Time + item.SecondLap.Time;

            if (inner.ContainsKey(firstLap.Driver) == false)
            {
                inner.Add(firstLap.Driver, new List <RacePit>());
            }
            inner[firstLap.Driver].Add(item);
        }
        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);
        }
        public bool Exists(Func <RaceLap, bool> predicate, Func <RaceLap, RaceLap> enumerator)
        {
            bool ret = predicate(this);

            if (ret)
            {
                return(true);
            }

            RaceLap prevLap = enumerator(this);

            if (prevLap != null)
            {
                prevLap.Exists(predicate, enumerator);
            }

            return(false);
        }
        public int Count(Func <RaceLap, bool> predicate, Func <RaceLap, RaceLap> enumerator)
        {
            int ret = 0;

            if (predicate(this))
            {
                ret++;
            }

            RaceLap prevLap = enumerator(this);

            if (prevLap != null)
            {
                ret += prevLap.Count(predicate, enumerator);
            }

            return(ret);
        }
        private void BuildPositions(out RaceLap winLapOfWinner)
        {
            winLapOfWinner = null;

            Positions.ClearExceptDriverFinalStatuses();
            List <RaceLap> laps = null;

            for (int i = 1; i <= Weekend.Settings.RaceLapCount; i++)
            {
                laps = GetLapsByLapNumber(i, true);
                LinkLapsInSameLapNumber(laps);
                laps.ForEach(k => Positions.AddLap(i, k));

                if (i == Weekend.Settings.RaceLapCount)
                {
                    winLapOfWinner = laps[0] as RaceLap;
                }
            }
        }
        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;
        }
        public RaceLap Min(Func <RaceLap, double> selector, Func <RaceLap, RaceLap> enumerator)
        {
            RaceLap ret = null;

            RaceLap prevLap = enumerator(this);

            if (prevLap != null)
            {
                ret = prevLap.Min(selector, enumerator);
                if (selector(this) < selector(ret))
                {
                    ret = this;
                }
            }
            else
            {
                ret = this;
            }

            return(ret);
        }
        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;
                }
            }
        }
 private static IComparable _GetLapCrossedAtTime(RaceLap lap)
 {
     return(lap.CrossedAtTime);
 }