CurveFlattener.java
package org.opentrafficsim.core.geometry;
import org.djunits.value.vdouble.scalar.Angle;
import org.djutils.draw.curve.Curve2d;
import org.djutils.draw.curve.Flattener2d;
import org.djutils.draw.curve.OffsetCurve2d;
import org.djutils.draw.curve.OffsetFlattener2d;
import org.djutils.draw.function.ContinuousPiecewiseLinearFunction;
import org.djutils.draw.line.PolyLine2d;
/**
* Record combining a {@link Flattener2d} and {@link OffsetFlattener2d}.
* <p>
* Copyright (c) 2024-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
* BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
* </p>
* @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
* @param flattener regular flattener
* @param offsetFlattener offset flattener
*/
public record CurveFlattener(Flattener2d flattener, OffsetFlattener2d offsetFlattener) implements Flattener2d, OffsetFlattener2d
{
/**
* Flattener based on number of segments.
* @param numSegments number of segments
*/
public CurveFlattener(final int numSegments)
{
this(new Flattener2d.NumSegments(numSegments), new OffsetFlattener2d.NumSegments(numSegments));
}
/**
* Flattener based on maximum deviation.
* @param maxDeviation maximum deviation
*/
public CurveFlattener(final double maxDeviation)
{
this(new Flattener2d.MaxDeviation(maxDeviation), new OffsetFlattener2d.MaxDeviation(maxDeviation));
}
/**
* Flattener based on maximum angle.
* @param maxAngle maximum angle
*/
public CurveFlattener(final Angle maxAngle)
{
this(new Flattener2d.MaxAngle(maxAngle.si),
new OffsetFlattener2d.MaxAngle(maxAngle.si));
}
/**
* Flattener based on maximum deviation and angle.
* @param maxDeviation maximum deviation
* @param maxAngle maximum angle
*/
public CurveFlattener(final double maxDeviation, final double maxAngle)
{
this(new Flattener2d.MaxDeviationAndAngle(maxDeviation, maxAngle),
new OffsetFlattener2d.MaxDeviationAndAngle(maxDeviation, maxAngle));
}
@Override
public PolyLine2d flatten(final Curve2d curve)
{
return this.flattener.flatten(curve);
}
@Override
public PolyLine2d flatten(final OffsetCurve2d curve, final ContinuousPiecewiseLinearFunction of)
{
return this.offsetFlattener.flatten(curve, of);
}
@Override
public boolean checkLoopBack(final Double prevDirection, final Double nextDirection)
{
return Flattener2d.super.checkLoopBack(prevDirection, nextDirection);
}
@Override
public boolean checkDirectionError(final Double segmentDirection, final Double curveDirectionAtStart,
final Double curveDirectionAtEnd, final double maxDirectionDeviation)
{
return Flattener2d.super.checkDirectionError(segmentDirection, curveDirectionAtStart, curveDirectionAtEnd,
maxDirectionDeviation);
}
}