1   package org.djutils.draw.curve;
2   
3   import org.djutils.draw.curve.Flattener.FlattableCurve;
4   import org.djutils.draw.line.PolyLine2d;
5   import org.djutils.draw.point.DirectedPoint2d;
6   import org.djutils.draw.point.Point2d;
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  public interface Curve2d
19          extends Curve<DirectedPoint2d, Double, Point2d, Flattener2d, PolyLine2d>, FlattableCurve<Point2d, Double>
20  {
21  
22      @Override
23      default DirectedPoint2d getStartPoint()
24      {
25          return new DirectedPoint2d(getPoint(0.0), getDirection(0.0));
26      }
27  
28      @Override
29      default DirectedPoint2d getEndPoint()
30      {
31          return new DirectedPoint2d(getPoint(1.0), getDirection(1.0));
32      }
33  
34      @Override
35      default Double getStartDirection()
36      {
37          return getStartPoint().dirZ;
38      }
39  
40      @Override
41      default Double getEndDirection()
42      {
43          return getEndPoint().dirZ;
44      }
45  
46      @Override
47      default Double getDirection(final double fraction)
48      {
49          Point2d p1, p2;
50          if (fraction < 0.5) 
51          {
52              p1 = getPoint(fraction);
53              p2 = getPoint(fraction + 1e-6);
54          }
55          else
56          {
57              p1 = getPoint(fraction - 1e-6);
58              p2 = getPoint(fraction);
59          }
60          return p1.directionTo(p2);
61      }
62  
63  }