View Javadoc
1   package org.opentrafficsim.road.gtu.lane.tactical.util.lmrs;
2   
3   import java.io.Serializable;
4   
5   import org.djunits.value.vdouble.scalar.Dimensionless;
6   import org.opentrafficsim.core.network.LateralDirectionality;
7   
8   /**
9    * Reflects the level of lane change desire a driver experiences in both the left and right direction. This may be either total
10   * desire, or only for a single lane change incentive. Desire is defined as ranging from 0 to 1, where 0 means no desire and 1
11   * means full desire. Values above 1 are not valid and should be limited to 1. Values below 0 are allowed and reflect that a
12   * lane change is undesired (which is different from not desired).
13   * <p>
14   * Copyright (c) 2013-2023 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
15   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
16   * </p>
17   * @author <a href="https://dittlab.tudelft.nl">Wouter Schakel</a>
18   */
19  public class Desire implements Serializable
20  {
21  
22      /** */
23      private static final long serialVersionUID = 20160413L;
24  
25      /** Level of left desire. */
26      private final double left;
27  
28      /** Level of right desire. */
29      private final double right;
30  
31      /** Easy access and efficient zero desired. */
32      public static final Desire ZERO = new Desire(0.0, 0.0);
33  
34      /**
35       * Constructor which sets the supplied desire. Desire is limited to a maximum of 1.
36       * @param left double; Left desire.
37       * @param right double; Right desire.
38       */
39      public Desire(final double left, final double right)
40      {
41          this.left = left <= 1 ? left : 1;
42          this.right = right <= 1 ? right : 1;
43      }
44  
45      /**
46       * Constructor which sets the supplied desire. Desire is limited to a maximum of 1.
47       * @param left Dimensionless; Left desire.
48       * @param right Dimensionless; Right desire.
49       */
50      public Desire(final Dimensionless left, final Dimensionless right)
51      {
52          this(left.si, right.si);
53      }
54  
55      /**
56       * Returns desire in the given direction.
57       * @param dir LateralDirectionality; Direction for the desire to return.
58       * @return Desire in the given direction.
59       */
60      public final double get(final LateralDirectionality dir)
61      {
62          if (dir.equals(LateralDirectionality.LEFT))
63          {
64              return this.left;
65          }
66          if (dir.equals(LateralDirectionality.RIGHT))
67          {
68              return this.right;
69          }
70          throw new RuntimeException("Lateral direction may not be NONE.");
71      }
72  
73      /**
74       * Returns lane change desire to left.
75       * @return Lane change desire to left.
76       */
77      public final double getLeft()
78      {
79          return this.left;
80      }
81  
82      /**
83       * Returns lane change desire to right.
84       * @return Lane change desire to right.
85       */
86      public final double getRight()
87      {
88          return this.right;
89      }
90  
91      /**
92       * Returns whether the left desire is larger than (or equal to) the right.
93       * @return Returns whether the left desire is larger than (or equal to) the right.
94       */
95      public final boolean leftIsLargerOrEqual()
96      {
97          return this.left >= this.right;
98      }
99  
100     /** {@inheritDoc} */
101     @Override
102     public final String toString()
103     {
104         return "Desire [left=" + this.left + ", right=" + this.right + "]";
105     }
106 
107 }