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-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
15   * BSD-style license. See <a href="http://opentrafficsim.org/docs/current/license.html">OpenTrafficSim License</a>.
16   * <p>
17   * @version $Revision$, $LastChangedDate$, by $Author$, initial version Apr 13, 2016 <br>
18   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
19   */
20  public class Desire implements Serializable
21  {
22  
23      /** */
24      private static final long serialVersionUID = 20160413L;
25  
26      /** Level of left desire. */
27      private final double left;
28  
29      /** Level of right desire. */
30      private final double right;
31  
32      /** Easy access and efficient zero desired. */
33      public static final Desirecsim/road/gtu/lane/tactical/util/lmrs/Desire.html#Desire">Desire ZERO = new Desire(0.0, 0.0);
34  
35      /**
36       * Constructor which sets the supplied desire. Desire is limited to a maximum of 1.
37       * @param left double; Left desire.
38       * @param right double; Right desire.
39       */
40      public Desire(final double left, final double right)
41      {
42          this.left = left <= 1 ? left : 1;
43          this.right = right <= 1 ? right : 1;
44      }
45  
46      /**
47       * Constructor which sets the supplied desire. Desire is limited to a maximum of 1.
48       * @param left Dimensionless; Left desire.
49       * @param right Dimensionless; Right desire.
50       */
51      public Desire(final Dimensionless left, final Dimensionless right)
52      {
53          this(left.si, right.si);
54      }
55  
56      /**
57       * Returns desire in the given direction.
58       * @param dir LateralDirectionality; Direction for the desire to return.
59       * @return Desire in the given direction.
60       */
61      public final double get(final LateralDirectionality dir)
62      {
63          if (dir.equals(LateralDirectionality.LEFT))
64          {
65              return this.left;
66          }
67          if (dir.equals(LateralDirectionality.RIGHT))
68          {
69              return this.right;
70          }
71          throw new RuntimeException("Lateral direction may not be NONE.");
72      }
73  
74      /**
75       * Returns lane change desire to left.
76       * @return Lane change desire to left.
77       */
78      public final double getLeft()
79      {
80          return this.left;
81      }
82  
83      /**
84       * Returns lane change desire to right.
85       * @return Lane change desire to right.
86       */
87      public final double getRight()
88      {
89          return this.right;
90      }
91  
92      /**
93       * Returns whether the left desire is larger than (or equal to) the right.
94       * @return Returns whether the left desire is larger than (or equal to) the right.
95       */
96      public final boolean leftIsLargerOrEqual()
97      {
98          return this.left >= this.right;
99      }
100 
101     /** {@inheritDoc} */
102     @Override
103     public final String toString()
104     {
105         return "Desire [left=" + this.left + ", right=" + this.right + "]";
106     }
107 
108 }