public override int GetHashCode() { int hash = 1; if (LaneId.Length != 0) { hash ^= LaneId.GetHashCode(); } if (Length != 0D) { hash ^= Length.GetHashCode(); } hash ^= leftOut_.GetHashCode(); hash ^= rightOut_.GetHashCode(); if (Cost != 0D) { hash ^= Cost.GetHashCode(); } if (centralCurve_ != null) { hash ^= CentralCurve.GetHashCode(); } if (IsVirtual != false) { hash ^= IsVirtual.GetHashCode(); } if (RoadId.Length != 0) { hash ^= RoadId.GetHashCode(); } return(hash); }
protected bool AddToTrafficLightQueue(LaneId laneId, RoadUser roadUser) { return((Intersection.GetTrafficLight(laneId).State == SignalState.STOP || Intersection.GetTrafficLight(laneId).State == SignalState.CLEAR_CROSSING) && roadUser.BoundingBox.IntersectsWith(Intersection.GetSensor(laneId).BoundingBox) && !roadUser.RedLight && !roadUser.CrossRedLight ); }
/// <summary> /// Get the sensor that is used to detect road users in the given lane. /// </summary> /// <param name="id">The id of the lane. <see cref="TrafficSimulator.LaneId"/> enum for possible types.</param> /// <returns>Returns the sensor that is used to detect road users in the given lane, /// or null of no sensor is present for the lane.</returns> public Sensor GetSensor(LaneId lane) { Sensor sensor; if (sensors.TryGetValue(lane, out sensor)) { return(sensor); } return(null); }
/// <summary> /// Get the traffic light that is a semephore for the given lane. /// </summary> /// <param name="id">The id of the lane. <see cref="TrafficSimulator.LaneId"/> enum for possible types.</param> /// <returns>Returns the traffic light that guards the given lane, /// or null of no traffic light is present for the lane.</returns> public TrafficLight GetTrafficLight(LaneId lane) { TrafficLight trafficLight; if (trafficLights.TryGetValue(lane, out trafficLight)) { return(trafficLight); } return(null); }
/// <summary> /// Add a traffic light to the lane. /// Traffic lights can only be added to inbound lanes and to pavements. /// When a traffic light is already present for the lane. It will be replaced by a new one. /// </summary> /// <param name="lane">The lane for which to add a traffic light.</param> private void AddTrafficLight(LaneId lane) { TrafficLight trafficLight = null; switch (lane) { case LaneId.NORTH_INBOUND_ROAD_LEFT: case LaneId.NORTH_INBOUND_ROAD_LEFT_AND_RIGHT: trafficLight = new DriverTrafficLight(new Point(114, 62), Orientation.HORIZONTAL_AND_FLIP); break; case LaneId.NORTH_INBOUND_ROAD_RIGHT: trafficLight = new DriverTrafficLight(new Point(103, 62), Orientation.HORIZONTAL_AND_FLIP); break; case LaneId.EAST_INBOUND_ROAD_LEFT: case LaneId.EAST_INBOUND_ROAD_LEFT_AND_RIGHT: trafficLight = new DriverTrafficLight(new Point(315, 114), Orientation.VERTICAL); break; case LaneId.EAST_INBOUND_ROAD_RIGHT: trafficLight = new DriverTrafficLight(new Point(315, 103), Orientation.VERTICAL); break; case LaneId.SOUTH_INBOUND_ROAD_LEFT: case LaneId.SOUTH_INBOUND_ROAD_LEFT_AND_RIGHT: trafficLight = new DriverTrafficLight(new Point(277, 315), Orientation.HORIZONTAL); break; case LaneId.SOUTH_INBOUND_ROAD_RIGHT: trafficLight = new DriverTrafficLight(new Point(288, 315), Orientation.HORIZONTAL); break; case LaneId.WEST_INBOUND_ROAD_LEFT: case LaneId.WEST_INBOUND_ROAD_LEFT_AND_RIGHT: trafficLight = new DriverTrafficLight(new Point(62, 277), Orientation.VERTICAL_AND_FLIP); break; case LaneId.WEST_INBOUND_ROAD_RIGHT: trafficLight = new DriverTrafficLight(new Point(62, 288), Orientation.VERTICAL_AND_FLIP); break; case LaneId.NORTH_PAVEMENT_LEFT: trafficLight = new PedestrianTrafficLight(new Point(275, 98), Orientation.HORIZONTAL_AND_FLIP); break; case LaneId.NORTH_PAVEMENT_RIGHT: trafficLight = new PedestrianTrafficLight(new Point(116, 98), Orientation.HORIZONTAL_AND_FLIP); break; case LaneId.EAST_PAVEMENT_LEFT: trafficLight = new PedestrianTrafficLight(new Point(286, 275), Orientation.VERTICAL); break; case LaneId.EAST_PAVEMENT_RIGHT: trafficLight = new PedestrianTrafficLight(new Point(286, 116), Orientation.VERTICAL); break; case LaneId.SOUTH_PAVEMENT_LEFT: trafficLight = new PedestrianTrafficLight(new Point(116, 286), Orientation.HORIZONTAL); break; case LaneId.SOUTH_PAVEMENT_RIGHT: trafficLight = new PedestrianTrafficLight(new Point(275, 286), Orientation.HORIZONTAL); break; case LaneId.WEST_PAVEMENT_LEFT: trafficLight = new PedestrianTrafficLight(new Point(98, 116), Orientation.VERTICAL_AND_FLIP); break; case LaneId.WEST_PAVEMENT_RIGHT: trafficLight = new PedestrianTrafficLight(new Point(98, 275), Orientation.VERTICAL_AND_FLIP); break; default: throw new ArgumentException("Lane must be inbound or a pavement.", "lane"); } if (trafficLight != null) { trafficLights[lane] = trafficLight; // Using [] will replace the existing value for the given key. } }
protected void HandleTrafficLightLane(RoadUser roadUser, LaneId lane) { if (Intersection.GetTrafficLight(lane).State == SignalState.GO && roadUser.BoundingBox.IntersectsWith(Intersection.GetSensor(lane).BoundingBox)) { roadUser.CrossRedLight = true; } if (Intersection.GetTrafficLight(lane).State == SignalState.STOP && roadUser.RedLight && roadUser.BoundingBox.IntersectsWith(Intersection.GetSensor(lane).BoundingBox)) { redLightList.Add(roadUser); } if (AddToTrafficLightQueue(lane, roadUser)) { roadUser.Speed = 0; if (!Queue.Contains(lane)) { Queue.Add(lane); } } }
/// <summary> /// Create a TrafficLightClickEventArgs object for sending with a TrafficLightClick event. /// </summary> /// <param name="laneId">The lane of the clicked traffic light.</param> public TrafficLightClickEventArgs(LaneId laneId) { LaneId = laneId; }
/// <summary> /// Create a SensorClickEventArgs object for sending with a SensorClick event. /// </summary> /// <param name="laneId">The lane of the clicked sensor.</param> public SensorClickEventArgs(LaneId laneId) { LaneId = laneId; }
/// <summary> /// Add a sensor to the lane. /// Sensors can only be added to inbound lanes and to pavements. /// When a sensor is already present for the lane. It will be replaced by a new one. /// </summary> /// <param name="lane">The lane for which to add a sensor.</param> private void AddSensor(LaneId lane) { Sensor sensor = null; switch (lane) { case LaneId.NORTH_INBOUND_ROAD_LEFT: sensor = new SingleLaneDriverSensor(new Point(175, 110), Orientation.HORIZONTAL); break; case LaneId.NORTH_INBOUND_ROAD_RIGHT: sensor = new SingleLaneDriverSensor(new Point(148, 110), Orientation.HORIZONTAL); break; case LaneId.NORTH_INBOUND_ROAD_LEFT_AND_RIGHT: sensor = new DoubleLaneDriverSensor(new Point(148, 110), Orientation.HORIZONTAL); break; case LaneId.EAST_INBOUND_ROAD_LEFT: sensor = new SingleLaneDriverSensor(new Point(286, 175), Orientation.VERTICAL); break; case LaneId.EAST_INBOUND_ROAD_RIGHT: sensor = new SingleLaneDriverSensor(new Point(286, 148), Orientation.VERTICAL); break; case LaneId.EAST_INBOUND_ROAD_LEFT_AND_RIGHT: sensor = new DoubleLaneDriverSensor(new Point(286, 148), Orientation.VERTICAL); break; case LaneId.SOUTH_INBOUND_ROAD_LEFT: sensor = new SingleLaneDriverSensor(new Point(205, 286), Orientation.HORIZONTAL); break; case LaneId.SOUTH_INBOUND_ROAD_RIGHT: sensor = new SingleLaneDriverSensor(new Point(233, 286), Orientation.HORIZONTAL); break; case LaneId.SOUTH_INBOUND_ROAD_LEFT_AND_RIGHT: sensor = new DoubleLaneDriverSensor(new Point(205, 286), Orientation.HORIZONTAL); break; case LaneId.WEST_INBOUND_ROAD_LEFT: sensor = new SingleLaneDriverSensor(new Point(110, 205), Orientation.VERTICAL); break; case LaneId.WEST_INBOUND_ROAD_RIGHT: sensor = new SingleLaneDriverSensor(new Point(110, 233), Orientation.VERTICAL); break; case LaneId.WEST_INBOUND_ROAD_LEFT_AND_RIGHT: sensor = new DoubleLaneDriverSensor(new Point(110, 205), Orientation.VERTICAL); break; case LaneId.NORTH_PAVEMENT_LEFT: sensor = new PedestrianSensor(new Point(263, 138), Orientation.HORIZONTAL); break; case LaneId.NORTH_PAVEMENT_RIGHT: sensor = new PedestrianSensor(new Point(128, 138), Orientation.HORIZONTAL); break; case LaneId.EAST_PAVEMENT_LEFT: sensor = new PedestrianSensor(new Point(258, 263), Orientation.VERTICAL); break; case LaneId.EAST_PAVEMENT_RIGHT: sensor = new PedestrianSensor(new Point(258, 128), Orientation.VERTICAL); break; case LaneId.SOUTH_PAVEMENT_LEFT: sensor = new PedestrianSensor(new Point(128, 258), Orientation.HORIZONTAL); break; case LaneId.SOUTH_PAVEMENT_RIGHT: sensor = new PedestrianSensor(new Point(263, 258), Orientation.HORIZONTAL); break; case LaneId.WEST_PAVEMENT_LEFT: sensor = new PedestrianSensor(new Point(138, 128), Orientation.VERTICAL); break; case LaneId.WEST_PAVEMENT_RIGHT: sensor = new PedestrianSensor(new Point(138, 263), Orientation.VERTICAL); break; case LaneId.NORTH_INBOUND_RAILWAY: sensor = new RailwaySensor(new Point(165, 2), Orientation.HORIZONTAL); break; case LaneId.SOUTH_OUTBOUND_RAILWAY: sensor = new RailwaySensor(new Point(165, 285), Orientation.HORIZONTAL); break; case LaneId.SOUTH_INBOUND_RAILWAY: sensor = new RailwaySensor(new Point(215, 388), Orientation.HORIZONTAL); break; case LaneId.NORTH_OUTBOUND_RAILWAY: sensor = new RailwaySensor(new Point(215, 105), Orientation.HORIZONTAL); break; default: throw new ArgumentException("Lane must be inbound roads, a pavement or a railway.", "lane"); } if (sensor != null) { sensors[lane] = sensor; // Using [] will replace the existing value for the given key. } }
public override string ToString() => LaneId.ToString();