예제 #1
0
        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);
        }
예제 #2
0
 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
            );
 }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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.
            }
        }
예제 #6
0
        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);
                }
            }
        }
예제 #7
0
 /// <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;
 }
예제 #8
0
 /// <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;
 }
예제 #9
0
        /// <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.
            }
        }
예제 #10
0
 public override string ToString() => LaneId.ToString();