1 package org.djutils.draw.curve;
2
3 import org.djutils.draw.function.ContinuousPiecewiseLinearFunction;
4 import org.djutils.draw.line.PolyLine2d;
5 import org.djutils.draw.point.Point2d;
6
7 /**
8 * OffsetCurve2d.java.
9 * <p>
10 * Copyright (c) 2024-2025 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
11 * for project information <a href="https://djutils.org" target="_blank"> https://djutils.org</a>. The DJUTILS project is
12 * distributed under a three-clause BSD-style license, which can be found at
13 * <a href="https://djutils.org/docs/license.html" target="_blank"> https://djutils.org/docs/license.html</a>.
14 * </p>
15 * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
16 */
17 public interface OffsetCurve2d extends Curve2d
18 {
19 /**
20 * Flatten a Curve2d while offsetting with the provided continuous offset into a PolyLine2d.
21 * Implementations should use the flattener when relevant and possible.
22 * @param flattener OffsetFlattener
23 * @param offsets offset data
24 * @return approximation of this <code>curve2d</code> with offset as a <code>PolyLine2d</code>
25 * @throws NullPointerException when <code>flattener</code>, or <code>offsets</code> is <code>null</code>
26 */
27 PolyLine2d toPolyLine(OffsetFlattener2d flattener, ContinuousPiecewiseLinearFunction offsets);
28
29 /**
30 * Returns the point at the given fraction. The fraction may represent any parameter, such as <i>t</i> in a Bézier
31 * curve, <i>s</i> in a Clothoid, or simply the fraction of length.
32 * @param fraction the fraction
33 * @param of provides fraction-dependent lateral offset to the point
34 * @return the point at the given <code>fraction</code>
35 */
36 Point2d getPoint(double fraction, ContinuousPiecewiseLinearFunction of);
37
38 /**
39 * Returns the direction at the given fraction. The fraction may represent any parameter, such as <i>t</i> in a
40 * Bézier curve, <i>s</i> in a Clothoid, or simply the fraction of length. The default implementation performs a
41 * numerical approach by looking at the direction between the points at fraction, and a point 1e-6 away.
42 * @param fraction the fraction
43 * @param of provides fraction-dependent lateral offset to the curve
44 * @return the direction at the given <code>fraction</code>
45 */
46 default double getDirection(final double fraction, final ContinuousPiecewiseLinearFunction of)
47 {
48 Point2d p1, p2;
49 if (fraction < 0.5) // to prevent going above 1.0
50 {
51 p1 = getPoint(fraction, of);
52 p2 = getPoint(fraction + 1e-6, of);
53 }
54 else
55 {
56 p1 = getPoint(fraction - 1e-6, of);
57 p2 = getPoint(fraction, of);
58 }
59 return p1.directionTo(p2);
60 }
61
62 /**
63 * Convert a position along the curve to a t-value in the <code>OffsetCurve2d</code> domain. For <code>Arc</code>
64 * and <code>Straight</code>, these t-values are the same. For <code>BezierCubic</code> they're not.
65 * @param position t-value in the <code>ContinuousPiecewiseLinearFunction</code> domain
66 * @return t-value in the <code>ContinuousPiecewiseLinearFunction</code> domain
67 */
68 default double getT(final double position)
69 {
70 return position / getLength();
71 }
72
73 }