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; }
public override void LeaveLane(Vehicle vehicle, bool changeilanecontainer) { base.LeaveLane(vehicle, changeilanecontainer); if (changeilanecontainer) Road.LeaveRoad(vehicle); }
public override void EnterLane(Vehicle vehicle) { base.EnterLane(vehicle); Road.EnterRoad(vehicle); }
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 }
public void LeaveRoad(Vehicle vehicle) { vehiclelist.Remove(vehicle); }
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); }
public virtual void LeaveLane(Vehicle vehicle, bool changeilanecontainer) { vehiclelist.Remove(vehicle); }
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]; }