public Vehicle[] OrderVehicles(double seconds, int vehiclecount, int capacity)
        {
            int amount =
                Math.Max(
                    Math.Min(Math.Min(GetSpawnAmount(seconds), ParameterPanel.VehicleCap - vehiclecount), capacity), 0);

            var vehicles = new Vehicle[amount];

            for (int i = 0; i < amount; i++)
                vehicles[i] = MakeVehicle();

            return vehicles;
        }
示例#2
0
 public override void LeaveLane(Vehicle vehicle, bool changeilanecontainer)
 {
     base.LeaveLane(vehicle, changeilanecontainer);
     if (changeilanecontainer)
         Road.LeaveRoad(vehicle);
 }
示例#3
0
 public override void EnterLane(Vehicle vehicle)
 {
     base.EnterLane(vehicle);
     Road.EnterRoad(vehicle);
 }
示例#4
0
        protected virtual double getspeedchange(double seconds, Vehicle nextvehicle)
        {
            double trafficlightdistance = 0;
            double vehicledistance = 0;

            if (nextvehicle != null) // Er is een voorganger. Bepaal de afstand tot hem.
            {
                if (lane.BelongsToSameILaneContainer(nextvehicle.lane)) // Ze rijden op dezelfde ILaneContainer.
                {
                    if (bezierindex == nextvehicle.bezierindex)
                        // Ze rijden op dezelfde bezier (of op beziers die naast elkaar liggen)
                        vehicledistance = nextvehicle.BackTime - FrontTime;
                    else if (bezierindex == nextvehicle.bezierindex - 1)
                        // NextVehicle rijdt op de volgende bezier (of op een bezier die naast de volgende bezier ligt)
                        vehicledistance = nextvehicle.BackTime*
                                          nextvehicle.lane.Beziers[nextvehicle.bezierindex].Length/
                                          lane.Beziers[bezierindex].Length + (1 - FrontTime);
                    else // NextVehicle rijdt de ver voor ons, zodat we 'm net zo goed kunnen negeren.
                        nextvehicle = null;
                }
                else // NextVehicle rijdt op de volgende Lane
                {
                    if (bezierindex == lane.Beziers.Length - 1 && nextvehicle.bezierindex == 0)
                        // Wij rijden op de laatste Bezier van onze Lane en NextVehicle rijdt op de eerste Bezier van zijn Lane
                        vehicledistance = nextvehicle.BackTime*nextvehicle.lane.Beziers[0].Length/
                                          lane.Beziers[bezierindex].Length + (1 - FrontTime);
                    else // NextVehicle rijdt de ver voor ons, zodat we 'm net zo goed kunnen negeren.
                        nextvehicle = null;
                }
            }

            if (trafficlight != null)
                trafficlightdistance = lane.Beziers.Length - FrontTimeIndex;

            if (nextvehicle == null) // Er is geen voorganger. Bepaal de snelheidsverandering.
            {
                if (trafficlight == null) // Er is geen verkeerslicht. Bepaal de snelheidsverandering.
                    return getnextspeedwithoutnextvehicle(seconds);
                if (trafficlight.TrafficLightState != TrafficLightState.Green &&
                    (trafficlightdistance < 5*speed/lane.Beziers[bezierindex].Length ||
                     trafficlightdistance < 5/lane.Beziers[bezierindex].Length))
                {
                    // We zijn vlakbij het verkeerslicht.

                    if (trafficlightdistance < speed*speed/lane.Beziers[bezierindex].Length/deceleration)
                        // We zijn vlakbij en kunnen niet meer redelijkerwijs stoppen.
                        return getnextspeedwithoutnextvehicle(seconds); // Rij door.
                    if (trafficlightdistance < 5/lane.Beziers[bezierindex].Length)
                        // We zijn op minder dan 5 meter afstand.
                        return -speed; // Ga stil staan.
                    return -Math.Min(speed, deceleration*seconds); // Rem
                }
                return getnextspeedwithoutnextvehicle(seconds); // Rij door
            }
            if (trafficlight == null) // Er is geen verkeerslicht. Bepaal de snelheidsverandering.
                return getspeedchangewithnextvehiclecloseby(seconds, vehicledistance, nextvehicle.Speed);
            if (trafficlight.TrafficLightState != TrafficLightState.Green &&
                (trafficlightdistance < 5*speed/lane.Beziers[bezierindex].Length ||
                 trafficlightdistance < 5/lane.Beziers[bezierindex].Length))
            {
                // We zijn vlakbij het verkeerslicht.

                if (trafficlightdistance < speed*speed/lane.Beziers[bezierindex].Length/deceleration)
                    // We zijn vlakbij en kunnen niet meer redelijkerwijs stoppen.
                    return getspeedchangewithnextvehiclecloseby(seconds, vehicledistance, nextvehicle.Speed);
                // Rij door.
                if (trafficlightdistance < 5/lane.Beziers[bezierindex].Length)
                    // We zijn op minder dan 5 meter afstand.
                    return -speed; // Ga stil staan.
                return -Math.Min(speed, deceleration*seconds); // Rem
            }
            return getspeedchangewithnextvehiclecloseby(seconds, vehicledistance, nextvehicle.Speed);
            // Rij door
        }
示例#5
0
 public void LeaveRoad(Vehicle vehicle)
 {
     vehiclelist.Remove(vehicle);
 }
示例#6
0
        public void EnterRoad(Vehicle vehicle)
        {
            if (vehiclelist.Contains(vehicle))
                return;

            for (int i = 0; i < vehiclelist.Count; i++)
            {
                if (!(vehiclelist[i].TimeIndex > vehicle.TimeIndex)) continue;
                vehiclelist.Insert(i, vehicle);
                return;
            }
            vehiclelist.Add(vehicle);
        }
示例#7
0
 public virtual void LeaveLane(Vehicle vehicle, bool changeilanecontainer)
 {
     vehiclelist.Remove(vehicle);
 }
示例#8
0
        public Vehicle GetNextVehicle(Vehicle vehicle)
        {
            int index = vehiclelist.IndexOf(vehicle);

            if (index == vehiclelist.Count - 1)
                return nextlanes.Count > 0 ? nextlanes[0].GetFirstVehicle() : null;
            return vehiclelist[index + 1];
        }