1 package org.opentrafficsim.road.network.lane.changing; 2 3 import java.io.Serializable; 4 import java.util.Collection; 5 6 import org.djunits.value.vdouble.scalar.Speed; 7 import org.opentrafficsim.core.gtu.GTUType; 8 import org.opentrafficsim.road.gtu.lane.LaneBasedGTU; 9 import org.opentrafficsim.road.network.lane.Lane; 10 11 /** 12 * This class implements the overtaking conditions. Examples are: 13 * <ul> 14 * <li>Overtaking on the left is allowed for all GTU types (not likely when there are e.g., both cars and bicycles in the 15 * model).</li> 16 * <li>A GTU type CAR can overtake a GTU type TRACTOR on the left on this road, but no other types of GTUs.</li> 17 * <li>When the speed of the GTU you try to overtake is lower than 50 km/h, you can overtake on the left.</li> 18 * <li>When the speed of the GTU you try to overtake is 25 km/h less than the maximum speed of the lane on which you and the 19 * other GTU are driving, you can overtake on the left or right.</li> 20 * <li>only overtake vehicles that have a maximum speed of under 25 km/h.</li> 21 * <li>Overtaking on the left is allowed for all GTU types, but overtaking on the right is also allowed when traffic density is 22 * below a certain number</li> 23 * <li>Overtaking on the left is allowed for all GTU types, but overtaking on the right is also allowed when the distance to a 24 * traffic light is less than 200 m</li> 25 * <li>Overtaking on the left and the right is allowed for all GTUs. This can e.g. be used on an American highway where all GTUs 26 * that are allowed on the highway can indeed overtake on the right or the left.</li> 27 * </ul> 28 * <b>Note:</b> The class only checks whether it is <b>allowed</b> to overtake another GTU on this road, not whether it is 29 * possible or safe to do so. That has to be checked by the GTU itself based on e.g., gap acceptance. 30 * <p> 31 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br> 32 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 33 * <p> 34 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 35 * initial version Sep 13, 2015 <br> 36 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 37 */ 38 public interface OvertakingConditions 39 { 40 /** 41 * Implementation of the overtaking conditions. E.g., is a car allowed on this road to overtake a tractor? If so, on which 42 * side(s)? 43 * @param lane the lane for which to evaluate the overtaking conditions 44 * @param gtu the GTU that might overtake another GTU 45 * @param predecessorGTU the GTU in front of the GTU that might want to overtake 46 * @return an overtaking direction: LEFT, RIGHT, BOTH or NONE 47 */ 48 OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, final LaneBasedGTU predecessorGTU); 49 50 /********************************************************************************************************************/ 51 /********************** IMPLEMENTATION CLASSES OF MOST COMMON OVERTAKING CONDITIONS *****************************/ 52 /********************************************************************************************************************/ 53 54 /** 55 * Overtaking on the left allowed for all GTUs. Note: overtaking on the right not allowed, so vehicles will stall on a 56 * multilane road near a traffic light. Also, bicycles will overtake cars on the "wrong" side of the road in this simple 57 * condition! 58 * <p> 59 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 60 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 61 * </p> 62 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 63 * initial version Sep 13, 2015 64 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 65 */ 66 public static class LeftOnly implements OvertakingConditions 67 { 68 69 /** {@inheritDoc} */ 70 @Override 71 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 72 final LaneBasedGTU predecessorGTU) 73 { 74 return OvertakingDirection.LEFT; 75 } 76 77 /** {@inheritDoc} */ 78 @Override 79 public final String toString() 80 { 81 return "LeftOnly []"; 82 } 83 } 84 85 /** 86 * Overtaking on the right allowed for all GTUs. Note: overtaking on the left not allowed, so vehicles will stall on a 87 * multilane road near a traffic light. Also, bicycles will overtake cars on the "wrong" side of the road in this simple 88 * condition! 89 * <p> 90 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 91 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 92 * </p> 93 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 94 * initial version Sep 13, 2015 95 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 96 */ 97 public static class RightOnly implements OvertakingConditions 98 { 99 100 /** {@inheritDoc} */ 101 @Override 102 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 103 final LaneBasedGTU predecessorGTU) 104 { 105 return OvertakingDirection.RIGHT; 106 } 107 108 /** {@inheritDoc} */ 109 @Override 110 public final String toString() 111 { 112 return "RightOnly []"; 113 } 114 } 115 116 /** 117 * No overtaking allowed. Note if there are multiple lanes, vehicles will stall near a traffic light. 118 * <p> 119 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 120 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 121 * </p> 122 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 123 * initial version Sep 13, 2015 124 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 125 */ 126 public static class None implements OvertakingConditions 127 { 128 129 /** {@inheritDoc} */ 130 @Override 131 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 132 final LaneBasedGTU predecessorGTU) 133 { 134 return OvertakingDirection.NONE; 135 } 136 137 /** {@inheritDoc} */ 138 @Override 139 public final String toString() 140 { 141 return "None []"; 142 } 143 } 144 145 /** 146 * Overtaking on both sides allowed. This is, e.g., the situation for an American highway. 147 * <p> 148 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 149 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 150 * </p> 151 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 152 * initial version Sep 13, 2015 153 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 154 */ 155 public static class LeftAndRight implements OvertakingConditions 156 { 157 158 /** {@inheritDoc} */ 159 @Override 160 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 161 final LaneBasedGTU predecessorGTU) 162 { 163 return OvertakingDirection.BOTH; 164 } 165 166 /** {@inheritDoc} */ 167 @Override 168 public final String toString() 169 { 170 return "LeftAndRight []"; 171 } 172 } 173 174 /** 175 * Overtaking on the left allowed for all GTUs, and overtaking on the right allowed under a given speed. 176 * <p> 177 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 178 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 179 * </p> 180 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 181 * initial version Sep 13, 2015 182 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 183 */ 184 public static class LeftAlwaysRightSpeed implements OvertakingConditions, Serializable 185 { 186 /** */ 187 private static final long serialVersionUID = 20150913L; 188 189 /** The speed under which overtaking on the "wrong" side is allowed. */ 190 private final Speed rightOvertakingSpeedMax; 191 192 /** 193 * @param rightOvertakingSpeedMax the speed under which overtaking on the "wrong" side is allowed 194 */ 195 public LeftAlwaysRightSpeed(final Speed rightOvertakingSpeedMax) 196 { 197 this.rightOvertakingSpeedMax = rightOvertakingSpeedMax; 198 } 199 200 /** {@inheritDoc} */ 201 @Override 202 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 203 final LaneBasedGTU predecessorGTU) 204 { 205 return gtu.getSpeed().lt(this.rightOvertakingSpeedMax) ? OvertakingDirection.BOTH 206 : OvertakingDirection.LEFT; 207 } 208 209 /** {@inheritDoc} */ 210 @Override 211 public final String toString() 212 { 213 return "LeftAlwaysRightSpeed [rightOvertakingSpeedMax=" + this.rightOvertakingSpeedMax + "]"; 214 } 215 } 216 217 /** 218 * Overtaking on the right allowed for all GTUs, and overtaking on the left allowed under a given speed. 219 * <p> 220 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 221 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 222 * </p> 223 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 224 * initial version Sep 13, 2015 225 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 226 */ 227 public static class RightAlwaysLeftSpeed implements OvertakingConditions, Serializable 228 { 229 /** */ 230 private static final long serialVersionUID = 20150913L; 231 232 /** The speed under which overtaking on the "wrong" side is allowed. */ 233 private final Speed leftOvertakingSpeedMax; 234 235 /** 236 * @param leftOvertakingSpeedMax the speed under which overtaking on the "wrong" side is allowed 237 */ 238 public RightAlwaysLeftSpeed(final Speed leftOvertakingSpeedMax) 239 { 240 this.leftOvertakingSpeedMax = leftOvertakingSpeedMax; 241 } 242 243 /** {@inheritDoc} */ 244 @Override 245 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 246 final LaneBasedGTU predecessorGTU) 247 { 248 return gtu.getSpeed().lt(this.leftOvertakingSpeedMax) ? OvertakingDirection.BOTH 249 : OvertakingDirection.RIGHT; 250 } 251 252 /** {@inheritDoc} */ 253 @Override 254 public final String toString() 255 { 256 return "RightAlwaysLeftSpeed [leftOvertakingSpeedMax=" + this.leftOvertakingSpeedMax + "]"; 257 } 258 } 259 260 /** 261 * Provide a collection of GTUs that can overtake another collection of GTUs on the left side, but not vice versa. Example: 262 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, SCOOTER}. 263 * In the latter case, cars, trucks and busses can overtake all other GTUs, but bicycles and scooters cannot overtake cars, 264 * trucks or busses. Another example is a lane where cars and motors can overtake all other road users, but trucks are not 265 * allowed to overtake. In that case, we would allow {CAR, MOTOR} to overtake {ALL} or {CAR, MOTOR} to overtake {CAR, MOTOR, 266 * TRUCK} in that lane. 267 * <p> 268 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 269 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 270 * </p> 271 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 272 * initial version Sep 13, 2015 273 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 274 */ 275 public static class LeftSet implements OvertakingConditions, Serializable 276 { 277 /** */ 278 private static final long serialVersionUID = 20150913L; 279 280 /** A collection of GTUs that can overtake another collection of GTUs. */ 281 private final Collection<GTUType> overtakingGTUs; 282 283 /** A collection of GTUs that can be overtaken by another collection of GTUs. */ 284 private final Collection<GTUType> overtakenGTUs; 285 286 /** 287 * Provide a collection of GTUs that can overtake another collection of GTUs on the left, but not vice versa. Example: 288 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, 289 * SCOOTER}, or {CAR, TRUCK, BUS} can overtake {TRACTOR}. 290 * @param overtakingGTUs the GTUs that can overtake a set of other GTUs, e.g., CAR, TRUCK. If overtakingGTUs contains 291 * GTUType.ALL, all GTUs can overtake. 292 * @param overtakenGTUs the GTUs that can be overtaken, e.g., BICYCLE, SCOOTER. If overtakenGTUs contains GTUType.ALL, 293 * all GTUs can be overtaken. 294 */ 295 public LeftSet(final Collection<GTUType> overtakingGTUs, final Collection<GTUType> overtakenGTUs) 296 { 297 this.overtakingGTUs = overtakingGTUs; 298 this.overtakenGTUs = overtakenGTUs; 299 } 300 301 /** {@inheritDoc} */ 302 @Override 303 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 304 final LaneBasedGTU predecessorGTU) 305 { 306 if ((this.overtakingGTUs.contains(GTUType.ALL) || this.overtakingGTUs.contains(gtu.getGTUType()) 307 && (this.overtakenGTUs.contains(GTUType.ALL) || this.overtakenGTUs 308 .contains(predecessorGTU.getGTUType())))) 309 { 310 return OvertakingDirection.LEFT; 311 } 312 return OvertakingDirection.NONE; 313 } 314 315 /** {@inheritDoc} */ 316 @Override 317 public final String toString() 318 { 319 return "LeftSet [overtakingGTUs=" + this.overtakingGTUs + ", overtakenGTUs=" + this.overtakenGTUs + "]"; 320 } 321 } 322 323 /** 324 * Provide a collection of GTUs that can overtake another collection of GTUs on the right side, but not vice versa. Example: 325 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, SCOOTER}. 326 * In the latter case, cars, trucks and busses can overtake all other GTUs, but bicycles and scooters cannot overtake cars, 327 * trucks or busses. Another example is a lane where cars and motors can overtake all other road users, but trucks are not 328 * allowed to overtake. In that case, we would allow {CAR, MOTOR} to overtake {ALL} or {CAR, MOTOR} to overtake {CAR, MOTOR, 329 * TRUCK} in that lane. 330 * <p> 331 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 332 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 333 * </p> 334 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 335 * initial version Sep 13, 2015 336 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 337 */ 338 public static class RightSet implements OvertakingConditions, Serializable 339 { 340 /** */ 341 private static final long serialVersionUID = 20150913L; 342 343 /** A collection of GTUs that can overtake another collection of GTUs. */ 344 private final Collection<GTUType> overtakingGTUs; 345 346 /** A collection of GTUs that can be overtaken by another collection of GTUs. */ 347 private final Collection<GTUType> overtakenGTUs; 348 349 /** 350 * Provide a collection of GTUs that can overtake another collection of GTUs on the right, but not vice versa. Example: 351 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, 352 * SCOOTER}, or {CAR, TRUCK, BUS} can overtake {TRACTOR}. 353 * @param overtakingGTUs the GTUs that can overtake a set of other GTUs, e.g., CAR, TRUCK. If overtakingGTUs contains 354 * GTUType.ALL, all GTUs can overtake. 355 * @param overtakenGTUs the GTUs that can be overtaken, e.g., BICYCLE, SCOOTER. If overtakenGTUs contains GTUType.ALL, 356 * all GTUs can be overtaken. 357 */ 358 public RightSet(final Collection<GTUType> overtakingGTUs, final Collection<GTUType> overtakenGTUs) 359 { 360 this.overtakingGTUs = overtakingGTUs; 361 this.overtakenGTUs = overtakenGTUs; 362 } 363 364 /** {@inheritDoc} */ 365 @Override 366 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 367 final LaneBasedGTU predecessorGTU) 368 { 369 if ((this.overtakingGTUs.contains(GTUType.ALL) || this.overtakingGTUs.contains(gtu.getGTUType()) 370 && (this.overtakenGTUs.contains(GTUType.ALL) || this.overtakenGTUs 371 .contains(predecessorGTU.getGTUType())))) 372 { 373 return OvertakingDirection.RIGHT; 374 } 375 return OvertakingDirection.NONE; 376 } 377 378 /** {@inheritDoc} */ 379 @Override 380 public final String toString() 381 { 382 return "RightSet [overtakingGTUs=" + this.overtakingGTUs + ", overtakenGTUs=" + this.overtakenGTUs + "]"; 383 } 384 } 385 386 /** 387 * Provide a collection of GTUs that can overtake another collection of GTUs on the left side, but not vice versa. Example: 388 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, SCOOTER}. 389 * In the latter case, cars, trucks and busses can overtake all other GTUs, but bicycles and scooters cannot overtake cars, 390 * trucks or busses. Another example is a lane where cars and motors can overtake all other road users, but trucks are not 391 * allowed to overtake. In that case, we would allow {CAR, MOTOR} to overtake {ALL} or {CAR, MOTOR} to overtake {CAR, MOTOR, 392 * TRUCK} in that lane. In addition, overtaking on the other side is allowed under a given driving speed. 393 * <p> 394 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 395 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 396 * </p> 397 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 398 * initial version Sep 13, 2015 399 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 400 */ 401 public static class LeftSetRightSpeed implements OvertakingConditions, Serializable 402 { 403 /** */ 404 private static final long serialVersionUID = 20150913L; 405 406 /** A collection of GTUs that can overtake another collection of GTUs. */ 407 private final Collection<GTUType> overtakingGTUs; 408 409 /** A collection of GTUs that can be overtaken by another collection of GTUs. */ 410 private final Collection<GTUType> overtakenGTUs; 411 412 /** The speed under which overtaking on the "wrong" side is allowed. */ 413 private final Speed rightOvertakingSpeedMax; 414 415 /** 416 * Provide a collection of GTUs that can overtake another collection of GTUs on the left, but not vice versa. Example: 417 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, 418 * SCOOTER}, or {CAR, TRUCK, BUS} can overtake {TRACTOR}. In addition, overtaking on the other side is allowed under a 419 * given driving speed. 420 * @param overtakingGTUs the GTUs that can overtake a set of other GTUs, e.g., CAR, TRUCK. If overtakingGTUs contains 421 * GTUType.ALL, all GTUs can overtake. 422 * @param overtakenGTUs the GTUs that can be overtaken, e.g., BICYCLE, SCOOTER. If overtakenGTUs contains GTUType.ALL, 423 * all GTUs can be overtaken. 424 * @param rightOvertakingSpeedMax the speed under which overtaking on the "wrong" side is allowed 425 */ 426 public LeftSetRightSpeed(final Collection<GTUType> overtakingGTUs, final Collection<GTUType> overtakenGTUs, 427 final Speed rightOvertakingSpeedMax) 428 { 429 this.overtakingGTUs = overtakingGTUs; 430 this.overtakenGTUs = overtakenGTUs; 431 this.rightOvertakingSpeedMax = rightOvertakingSpeedMax; 432 } 433 434 /** {@inheritDoc} */ 435 @Override 436 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 437 final LaneBasedGTU predecessorGTU) 438 { 439 boolean left = 440 ((this.overtakingGTUs.contains(GTUType.ALL) || this.overtakingGTUs.contains(gtu.getGTUType()) 441 && (this.overtakenGTUs.contains(GTUType.ALL) || this.overtakenGTUs.contains(predecessorGTU 442 .getGTUType())))); 443 boolean right = gtu.getSpeed().lt(this.rightOvertakingSpeedMax); 444 if (left) 445 { 446 return right ? OvertakingDirection.BOTH : OvertakingDirection.LEFT; 447 } 448 return right ? OvertakingDirection.RIGHT : OvertakingDirection.NONE; 449 } 450 451 /** {@inheritDoc} */ 452 @Override 453 public final String toString() 454 { 455 return "LeftSetRightSpeed [overtakingGTUs=" + this.overtakingGTUs + ", overtakenGTUs=" + this.overtakenGTUs 456 + ", rightOvertakingSpeedMax=" + this.rightOvertakingSpeedMax + "]"; 457 } 458 } 459 460 /** 461 * Provide a collection of GTUs that can overtake another collection of GTUs on the right side, but not vice versa. Example: 462 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, SCOOTER}. 463 * In the latter case, cars, trucks and busses can overtake all other GTUs, but bicycles and scooters cannot overtake cars, 464 * trucks or busses. Another example is a lane where cars and motors can overtake all other road users, but trucks are not 465 * allowed to overtake. In that case, we would allow {CAR, MOTOR} to overtake {ALL} or {CAR, MOTOR} to overtake {CAR, MOTOR, 466 * TRUCK} in that lane. In addition, overtaking on the other side is allowed under a given driving speed. 467 * <p> 468 * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. 469 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>. 470 * </p> 471 * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $, 472 * initial version Sep 13, 2015 473 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a> 474 */ 475 public static class RightSetLeftSpeed implements OvertakingConditions, Serializable 476 { 477 /** */ 478 private static final long serialVersionUID = 20150913L; 479 480 /** A collection of GTUs that can overtake another collection of GTUs. */ 481 private final Collection<GTUType> overtakingGTUs; 482 483 /** A collection of GTUs that can be overtaken by another collection of GTUs. */ 484 private final Collection<GTUType> overtakenGTUs; 485 486 /** The speed under which overtaking on the "wrong" side is allowed. */ 487 private final Speed leftOvertakingSpeedMax; 488 489 /** 490 * Provide a collection of GTUs that can overtake another collection of GTUs on the left, but not vice versa. Example: 491 * {CAR, TRUCK, BUS} can overtake {BICYCLE, SCOOTER}, or {CAR, TRUCK, BUS} can overtake {CAR, TRUCK, BUS, BICYCLE, 492 * SCOOTER}, or {CAR, TRUCK, BUS} can overtake {TRACTOR}. In addition, overtaking on the other side is allowed under a 493 * given driving speed. 494 * @param overtakingGTUs the GTUs that can overtake a set of other GTUs, e.g., CAR, TRUCK. If overtakingGTUs contains 495 * GTUType.ALL, all GTUs can overtake. 496 * @param overtakenGTUs the GTUs that can be overtaken, e.g., BICYCLE, SCOOTER. If overtakenGTUs contains GTUType.ALL, 497 * all GTUs can be overtaken. 498 * @param leftOvertakingSpeedMax the speed under which overtaking on the "wrong" side is allowed 499 */ 500 public RightSetLeftSpeed(final Collection<GTUType> overtakingGTUs, final Collection<GTUType> overtakenGTUs, 501 final Speed leftOvertakingSpeedMax) 502 { 503 this.overtakingGTUs = overtakingGTUs; 504 this.overtakenGTUs = overtakenGTUs; 505 this.leftOvertakingSpeedMax = leftOvertakingSpeedMax; 506 } 507 508 /** {@inheritDoc} */ 509 @Override 510 public final OvertakingDirection checkOvertaking(final Lane lane, final LaneBasedGTU gtu, 511 final LaneBasedGTU predecessorGTU) 512 { 513 boolean right = 514 ((this.overtakingGTUs.contains(GTUType.ALL) || this.overtakingGTUs.contains(gtu.getGTUType()) 515 && (this.overtakenGTUs.contains(GTUType.ALL) || this.overtakenGTUs.contains(predecessorGTU 516 .getGTUType())))); 517 boolean left = gtu.getSpeed().lt(this.leftOvertakingSpeedMax); 518 if (right) 519 { 520 return left ? OvertakingDirection.BOTH : OvertakingDirection.RIGHT; 521 } 522 return left ? OvertakingDirection.LEFT : OvertakingDirection.NONE; 523 } 524 525 /** {@inheritDoc} */ 526 @Override 527 public final String toString() 528 { 529 return "RightSetLeftSpeed [overtakingGTUs=" + this.overtakingGTUs + ", overtakenGTUs=" + this.overtakenGTUs 530 + ", leftOvertakingSpeedMax=" + this.leftOvertakingSpeedMax + "]"; 531 } 532 } 533 534 }