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