View Javadoc
1   package org.opentrafficsim.core.geometry;
2   
3   import org.djunits.value.vdouble.scalar.Direction;
4   import org.djutils.draw.line.PolyLine2d;
5   import org.djutils.draw.point.OrientedPoint2d;
6   
7   /**
8    * A continuous line defines a line in an exact manner, from which numerical polylines can be derived. The continuous definition
9    * is useful to accurately connect different lines, e.g. based on the direction of the point where they meet. Moreover, this
10   * direction may be accurately be determined by either of the lines. For example, an arc can be defined up to a certain angle.
11   * Whatever the angle of the last line segment in a polyline for the arc may be, the continuous line contains the final
12   * direction exactly. The continuous definition is also useful to define accurate offset lines, which depend on accurate
13   * directions especially at the line end points.
14   * <p>
15   * Copyright (c) 2023-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
16   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
17   * </p>
18   * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
19   */
20  public interface ContinuousLine
21  {
22  
23      /**
24       * Start point.
25       * @return OrientedPoint2d; start point.
26       */
27      OrientedPoint2d getStartPoint();
28  
29      /**
30       * End point.
31       * @return OrientedPoint2d; end point.
32       */
33      OrientedPoint2d getEndPoint();
34  
35      /**
36       * Start direction.
37       * @return Direction; start point.
38       */
39      default Direction getStartDirection()
40      {
41          return Direction.instantiateSI(getStartPoint().dirZ);
42      }
43  
44      /**
45       * End direction.
46       * @return Direction; end point.
47       */
48      default Direction getEndDirection()
49      {
50          return Direction.instantiateSI(getEndPoint().dirZ);
51      }
52  
53      /**
54       * Start curvature.
55       * @return double; start curvature.
56       */
57      double getStartCurvature();
58  
59      /**
60       * End curvature.
61       * @return double; end curvature.
62       */
63      double getEndCurvature();
64  
65      /**
66       * Start radius.
67       * @return double; start radius.
68       */
69      default double getStartRadius()
70      {
71          return 1.0 / getStartCurvature();
72      }
73  
74      /**
75       * End radius.
76       * @return double; end radius.
77       */
78      default double getEndRadius()
79      {
80          return 1.0 / getEndCurvature();
81      }
82  
83      /**
84       * Flatten continuous line in to a polyline. Implementations should use the flattener when relevant and possible.
85       * @param flattener Flattener; flattener.
86       * @return PolyLine2d; flattened line.
87       */
88      PolyLine2d flatten(Flattener flattener);
89  
90      /**
91       * Flatten continuous line offset in to a polyline. Implementations should use the flattener when relevant and possible.
92       * @param offsets FractionalLengthData; offset data.
93       * @param flattener Flattener; flattener.
94       * @return PolyLine2d; flattened line.
95       */
96      PolyLine2d flattenOffset(FractionalLengthData offsets, Flattener flattener);
97  
98      /**
99       * Return the length of the line.
100      * @return double; length of the line.
101      */
102     double getLength();
103 
104 }