1 package org.opentrafficsim.road.gtu.lane.perception.headway;
2
3 import org.djunits.value.vdouble.scalar.Acceleration;
4 import org.djunits.value.vdouble.scalar.Length;
5 import org.djunits.value.vdouble.scalar.Speed;
6 import org.opentrafficsim.core.gtu.GTUException;
7
8 import nl.tudelft.simulation.language.Throw;
9
10 /**
11 * Container for a reference to information about a (lane based) GTU and a headway. The Headway can store information about GTUs
12 * or objects ahead of the reference GTU, behind the reference GTU, or (partially) parallel to the reference GTU. In addition to
13 * the (perceived) headway, several other pieces of information can be stored, such as (perceived) speed, (perceived)
14 * acceleration, (perceived) turn indicators, and (perceived) braking lights. <br>
15 * Special care must be taken in curves when perceiving headway of a GTU or object on an adjacent lane.The question is whether
16 * we perceive the parallel or ahead/behind based on a line perpendicular to the front/back of the GTU (rectangular), or
17 * perpendicular to the center line of the lane (wedge-shaped in case of a curve). The difficulty of a wedge-shaped situation is
18 * that reciprocity might be violated: in case of a clothoid, for instance, it is not sure that the point on the center line
19 * when projected from lane 1 to lane 2 is the same as the projection from lane 2 to lane 1. The same holds for shapes with
20 * sharp bends. Therefore, algorithms implementing headway should only project the <i>reference point</i> of the reference GTU
21 * on the center line of the adjacent lane, and then calculate the forward position and backward position on the adjacent lane
22 * based on the reference point. Still, our human perception of what is parallel and what not, is not reflected by fractional
23 * positions. See examples in
24 * <a href= "http://simulation.tudelft.nl:8085/browse/OTS-113">http://simulation.tudelft.nl:8085/browse/OTS-113</a>.
25 * <p>
26 * Copyright (c) 2013-2017 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
27 * BSD-style license. See <a href="http://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
28 * <p>
29 * @version $Revision: 1368 $, $LastChangedDate: 2015-09-02 00:20:20 +0200 (Wed, 02 Sep 2015) $, by $Author: averbraeck $,
30 * initial version 11 feb. 2015 <br>
31 * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
32 * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
33 * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
34 */
35 public abstract class AbstractHeadwayCopy extends AbstractHeadway
36 {
37 /** */
38 private static final long serialVersionUID = 20160410L;
39
40 /** The id of the other object for comparison purposes, cannot be null. */
41 private final String id;
42
43 /** The (perceived) length of the other object. Can be null if unknown. */
44 private final Length length;
45
46 /** The (perceived) speed of the other object. v>0 seen from driver chair. Can be null if unknown. */
47 private final Speed speed;
48
49 /** The (perceived) acceleration of the other object. Can be null if unknown. */
50 private final Acceleration acceleration;
51
52 /** The object type. */
53 private final ObjectType objectType;
54
55 /**
56 * Construct a new Headway information object, for an object in front, behind, or in parallel with us. <br>
57 * @param objectType the perceived object type, can be null if object type unknown.
58 * @param id the id of the object for comparison purposes, can not be null.
59 * @param distance the distance to the other object
60 * @param length the length of the other object, can be null if not applicable.
61 * @param overlapFront the front-front distance to the other object
62 * @param overlap the 'center' overlap with the other object
63 * @param overlapRear the rear-rear distance to the other object
64 * @param speed the (perceived) speed of the other object; can be null if unknown.
65 * @param acceleration the (perceived) acceleration of the other object; can be null if unknown.
66 * @throws GTUException when id is null, or parameters are inconsistent
67 */
68 @SuppressWarnings("checkstyle:parameternumber")
69 private AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length distance, final Length length,
70 final Speed speed, final Acceleration acceleration, final Length overlapFront, final Length overlap,
71 final Length overlapRear) throws GTUException
72 {
73 super(distance, overlapFront, overlap, overlapRear);
74 Throw.when(id == null, GTUException.class, "Object id of a headway cannot be null");
75 this.id = id;
76
77 this.objectType = objectType;
78 this.length = length;
79 this.speed = speed;
80 this.acceleration = acceleration;
81 }
82
83 /**
84 * Construct a new Headway information object, for a moving object ahead of us or behind us.
85 * @param objectType the perceived object type, can be null if object type unknown.
86 * @param id the id of the object for comparison purposes, can not be null.
87 * @param distance the distance to the other object; if this constructor is used, distance cannot be null.
88 * @param speed the (perceived) speed of the other object; can be null if unknown.
89 * @param acceleration the (perceived) acceleration of the other object; can be null if unknown.
90 * @throws GTUException when id is null, or parameters are inconsistent
91 */
92 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length distance, final Speed speed,
93 final Acceleration acceleration) throws GTUException
94 {
95 this(objectType, id, distance, null, speed, acceleration, null, null, null);
96 }
97
98 /**
99 * Construct a new Headway information object, for a non-moving object ahead of us or behind us.
100 * @param objectType the perceived object type, can be null if object type unknown.
101 * @param id the id of the object for comparison purposes, can not be null.
102 * @param distance the distance to the other object; if this constructor is used, distance cannot be null.
103 * @throws GTUException when id is null, or parameters are inconsistent
104 */
105 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length distance) throws GTUException
106 {
107 this(objectType, id, distance, null, Speed.ZERO, Acceleration.ZERO, null, null, null);
108 }
109
110 /**
111 * Construct a new Headway information object, for a moving object parallel with us.
112 * @param objectType the perceived object type, can be null if object type unknown.
113 * @param id the id of the object for comparison purposes, can not be null.
114 * @param overlapFront the front-front distance to the other object; if this constructor is used, this value cannot be null.
115 * @param overlap the 'center' overlap with the other object; if this constructor is used, this value cannot be null.
116 * @param overlapRear the rear-rear distance to the other object; if this constructor is used, this value cannot be null.
117 * @param speed the (perceived) speed of the other object; can be null if unknown.
118 * @param acceleration the (perceived) acceleration of the other object; can be null if unknown.
119 * @throws GTUException when id is null, or parameters are inconsistent
120 */
121 @SuppressWarnings("checkstyle:parameternumber")
122 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length overlapFront, final Length overlap,
123 final Length overlapRear, final Speed speed, final Acceleration acceleration) throws GTUException
124 {
125 this(objectType, id, null, null, speed, acceleration, overlapFront, overlap, overlapRear);
126 }
127
128 /**
129 * Construct a new Headway information object, for a non-moving object parallel with us.
130 * @param objectType the perceived object type, can be null if object type unknown.
131 * @param id the id of the object for comparison purposes, can not be null.
132 * @param overlapFront the front-front distance to the other object; if this constructor is used, this value cannot be null.
133 * @param overlap the 'center' overlap with the other object; if this constructor is used, this value cannot be null.
134 * @param overlapRear the rear-rear distance to the other object; if this constructor is used, this value cannot be null.
135 * @throws GTUException when id is null, or parameters are inconsistent
136 */
137 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length overlapFront, final Length overlap,
138 final Length overlapRear) throws GTUException
139 {
140 this(objectType, id, null, null, null, null, overlapFront, overlap, overlapRear);
141 }
142
143 /**
144 * Construct a new Headway information object, for a moving object ahead of us or behind us.
145 * @param objectType the perceived object type, can be null if object type unknown.
146 * @param id the id of the object for comparison purposes, can not be null.
147 * @param distance the distance to the other object; if this constructor is used, distance cannot be null.
148 * @param length the length of the other object; if this constructor is used, length cannot be null.
149 * @param speed the (perceived) speed of the other object; can be null if unknown.
150 * @param acceleration the (perceived) acceleration of the other object; can be null if unknown.
151 * @throws GTUException when id is null, or parameters are inconsistent
152 */
153 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length distance, final Length length,
154 final Speed speed, final Acceleration acceleration) throws GTUException
155 {
156 this(objectType, id, distance, length, speed, acceleration, null, null, null);
157 Throw.whenNull(length, "Length may not be null.");
158 }
159
160 /**
161 * Construct a new Headway information object, for a non-moving object ahead of us or behind us.
162 * @param objectType the perceived object type, can be null if object type unknown.
163 * @param id the id of the object for comparison purposes, can not be null.
164 * @param distance the distance to the other object; if this constructor is used, distance cannot be null.
165 * @param length the length of the other object; if this constructor is used, length cannot be null.
166 * @throws GTUException when id is null, or parameters are inconsistent
167 */
168 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length distance, final Length length)
169 throws GTUException
170 {
171 this(objectType, id, distance, length, null, null, null, null, null);
172 Throw.whenNull(length, "Length may not be null.");
173 }
174
175 /**
176 * Construct a new Headway information object, for a moving object parallel with us.
177 * @param objectType the perceived object type, can be null if object type unknown.
178 * @param id the id of the object for comparison purposes, can not be null.
179 * @param overlapFront the front-front distance to the other object; if this constructor is used, this value cannot be null.
180 * @param overlap the 'center' overlap with the other object; if this constructor is used, this value cannot be null.
181 * @param overlapRear the rear-rear distance to the other object; if this constructor is used, this value cannot be null.
182 * @param length the length of the other object; if this constructor is used, length cannot be null.
183 * @param speed the (perceived) speed of the other object; can be null if unknown.
184 * @param acceleration the (perceived) acceleration of the other object; can be null if unknown.
185 * @throws GTUException when id is null, or parameters are inconsistent
186 */
187 @SuppressWarnings("checkstyle:parameternumber")
188 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length overlapFront, final Length overlap,
189 final Length overlapRear, final Length length, final Speed speed, final Acceleration acceleration)
190 throws GTUException
191 {
192 this(objectType, id, null, length, speed, acceleration, overlapFront, overlap, overlapRear);
193 Throw.whenNull(length, "Length may not be null.");
194 }
195
196 /**
197 * Construct a new Headway information object, for a non-moving object parallel with us.
198 * @param objectType the perceived object type, can be null if object type unknown.
199 * @param id the id of the object for comparison purposes, can not be null.
200 * @param overlapFront the front-front distance to the other object; if this constructor is used, this value cannot be null.
201 * @param overlap the 'center' overlap with the other object; if this constructor is used, this value cannot be null.
202 * @param overlapRear the rear-rear distance to the other object; if this constructor is used, this value cannot be null.
203 * @param length the length of the other object; if this constructor is used, length cannot be null.
204 * @throws GTUException when id is null, or parameters are inconsistent
205 */
206 public AbstractHeadwayCopy(final ObjectType objectType, final String id, final Length overlapFront, final Length overlap,
207 final Length overlapRear, final Length length) throws GTUException
208 {
209 this(objectType, id, null, length, null, null, overlapFront, overlap, overlapRear);
210 Throw.whenNull(length, "Length may not be null.");
211 }
212
213 /** {@inheritDoc} */
214 @Override
215 public final String getId()
216 {
217 return this.id;
218 }
219
220 /** {@inheritDoc} */
221 @Override
222 public final Length getLength()
223 {
224 return this.length;
225 }
226
227 /** {@inheritDoc} */
228 @Override
229 public final Speed getSpeed()
230 {
231 return this.speed;
232 }
233
234 /** {@inheritDoc} */
235 @Override
236 public final ObjectType getObjectType()
237 {
238 return this.objectType;
239 }
240
241 /** {@inheritDoc} */
242 @Override
243 public final Acceleration getAcceleration()
244 {
245 return this.acceleration;
246 }
247
248 /** {@inheritDoc} */
249 @Override
250 public int hashCode()
251 {
252 final int prime = 31;
253 int result = super.hashCode();
254 result = prime * result + ((this.acceleration == null) ? 0 : this.acceleration.hashCode());
255 result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
256 result = prime * result + ((this.length == null) ? 0 : this.length.hashCode());
257 result = prime * result + ((this.objectType == null) ? 0 : this.objectType.hashCode());
258 result = prime * result + ((this.speed == null) ? 0 : this.speed.hashCode());
259 return result;
260 }
261
262 /** {@inheritDoc} */
263 @Override
264 public boolean equals(final Object obj)
265 {
266 if (this == obj)
267 {
268 return true;
269 }
270 if (!super.equals(obj))
271 {
272 return false;
273 }
274 if (getClass() != obj.getClass())
275 {
276 return false;
277 }
278 AbstractHeadwayCopy other = (AbstractHeadwayCopy) obj;
279 if (this.acceleration == null)
280 {
281 if (other.acceleration != null)
282 {
283 return false;
284 }
285 }
286 else if (!this.acceleration.equals(other.acceleration))
287 {
288 return false;
289 }
290 if (this.id == null)
291 {
292 if (other.id != null)
293 {
294 return false;
295 }
296 }
297 else if (!this.id.equals(other.id))
298 {
299 return false;
300 }
301 if (this.length == null)
302 {
303 if (other.length != null)
304 {
305 return false;
306 }
307 }
308 else if (!this.length.equals(other.length))
309 {
310 return false;
311 }
312 if (this.objectType != other.objectType)
313 {
314 return false;
315 }
316 if (this.speed == null)
317 {
318 if (other.speed != null)
319 {
320 return false;
321 }
322 }
323 else if (!this.speed.equals(other.speed))
324 {
325 return false;
326 }
327 return true;
328 }
329
330 }